Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
905abb0
simple interface for binding events; add jQuery dep
cpsievert Nov 27, 2015
1e35205
callback can be character string
cpsievert Nov 27, 2015
19c2f32
export as.widget()
cpsievert Nov 27, 2015
5b4918b
first stab at crosstalk
cpsievert Nov 30, 2015
9f0ea43
fix shiny binding
cpsievert Dec 1, 2015
e33432b
fix height/width specification
cpsievert Dec 1, 2015
561db93
key instead of source/target
cpsievert Dec 1, 2015
d42dd01
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 2, 2015
d981b94
remove bind() since htmlwidgets will provide an official mechanism
cpsievert Dec 2, 2015
1a93c3b
document bind removal
cpsievert Dec 2, 2015
ae85b3a
document other previous changes
cpsievert Dec 2, 2015
23e7afa
cleanup js mess
cpsievert Dec 2, 2015
e4f9b08
add set argument for scoping
cpsievert Dec 2, 2015
ba9b57f
add some basic examples
cpsievert Dec 2, 2015
3e84aa8
install crosstalk; save toWidget for legacy reasons
cpsievert Dec 2, 2015
ebc365b
Update examples
cpsievert Dec 2, 2015
d0b6118
simplify logic, more sensible naming, try to pass data.points to shiny
cpsievert Dec 6, 2015
d180812
send a subset of th data.points object
cpsievert Dec 8, 2015
3663018
merge conflicts
cpsievert Dec 14, 2015
5583240
merge conflicts
cpsievert Dec 19, 2015
86f2fcc
merge conflicts
cpsievert Dec 23, 2015
379d57d
Merge branch 'feature/events' of https://github.com/ropensci/plotly i…
cpsievert Dec 23, 2015
7d4f0cb
merge conflicts
cpsievert Dec 23, 2015
20f502c
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
4061899
document
cpsievert Dec 23, 2015
e363ccc
update examples
cpsievert Dec 23, 2015
466de0b
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .Rbuildignore
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
.travis.yml
Karthik_local.R
playground/
Makefile
man-roxygen
man-roxygen/^.*\.Rproj$
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
R/.Rhistory
Rapp.history
/Karthik_local.R
playground/
*~
.Rhistory
.RData
Expand Down
1 change: 1 addition & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@ before_install:

install:
- ./travis-tool.sh install_deps
- ./travis-tool.sh install_github jcheng5/crosstalk

before_script:
- git config --global user.name "cpsievert"
Expand Down
1 change: 1 addition & 0 deletions DESCRIPTION
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ Imports:
viridis,
base64enc,
htmlwidgets,
crosstalk,
plyr
Suggests:
dplyr,
Expand Down
15 changes: 10 additions & 5 deletions R/plotly.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@
#' @param symbols A character vector of symbol types. Possible values:
#' 'dot', 'cross', 'diamond', 'square', 'triangle-down', 'triangle-left', 'triangle-right', 'triangle-up'
#' @param size A variable name or numeric vector to encode the size of markers.
#' @param key a selection variable for linked views
#' @param set share selections across this grouping variable.
#' @param width Width in pixels (optional, defaults to automatic sizing).
#' @param height Height in pixels (optional, defaults to automatic sizing).
#' @param inherit logical. Should future traces inherit properties from this initial trace?
Expand DownExpand Up@@ -64,9 +66,9 @@
#' }
#'
plot_ly <- function(data = data.frame(), ..., type = "scatter",
group, color, colors, symbol, symbols, size,
width = NULL, height = NULL, inherit = TRUE,
evaluate = FALSE) {
group, color, colors, symbol, symbols, size,
key, set = "A", width = NULL, height = NULL,
inherit = TRUE, evaluate = FALSE) {
# "native" plotly arguments
argz <- substitute(list(...))
# old arguments to this function that are no longer supported
Expand All@@ -83,16 +85,19 @@ plot_ly <- function(data = data.frame(), ..., type = "scatter",
if (!missing(symbol)) argz$symbol <- substitute(symbol)
if (!missing(symbols)) argz$symbols <- substitute(symbols)
if (!missing(size)) argz$size <- substitute(size)
if (!missing(key)) argz$key <- substitute(key)
# trace information
tr <- list(
type = type,
args = argz,
env = list2env(data), # environment in which to evaluate arguments
enclos = parent.frame(), # if objects aren't found in env, look here
inherit = inherit
inherit = inherit,
set = set
)
# plotly objects should always have a _list_ of trace(s)

p <- list(
# plotly objects should always have a _list_ of trace(s)
data = list(tr),
layout = NULL,
url = NULL,
Expand Down
1 change: 1 addition & 0 deletions R/print.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,6 +49,7 @@ as.widget <- function(x, ...) {
padding = 5,
browser.fill = TRUE
),
dependencies = crosstalk::dependencies,
...
)
}
Expand Down
34 changes: 34 additions & 0 deletions inst/examples/crosstalk.R
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
# access renderPlotly() selections on a shiny server
# https://github.com/cpsievert/shiny_apps/blob/master/plotlyCrosstalk/app.R

# TODO:
# (1) pass selections from another htmlwidget (rcdimple?) to renderPlotly()
# (2) crosstalk without shiny (see examples below)
# (3) define custom event behavior in JS from R?

library(plotly)
library(htmltools)

# click/show selects?
mtcars$gear <- factor(mtcars$gear)
mtcars$cyl <- factor(mtcars$cyl)
p1 <- plot_ly(mtcars, x = wt, y = mpg, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = wt, y = disp, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
# TODO: inline-block?
browsable(tagList(
as.widget(p1),
as.widget(p2)
))

library(dplyr)
m <- count(mtcars, cyl)
p1 <- plot_ly(m, x = cyl, y = n, type = "bar",
key = cyl, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = mpg, y = disp, mode = "markers",
key = cyl, set = "A", width = 400)
browsable(tagList(
as.widget(p1),
as.widget(p2)
))
37 changes: 37 additions & 0 deletions inst/htmlwidgets/lib/jquery/LICENSE.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
Copyright 2005, 2014 jQuery Foundation and other contributors,
https://jquery.org/

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery

The following license applies to all parts of this software except as
documented below:

====

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

====

All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.
4 changes: 4 additions & 0 deletions inst/htmlwidgets/lib/jquery/jquery.min.js

Large diffs are not rendered by default.

37 changes: 36 additions & 1 deletion inst/htmlwidgets/plotly.js
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@

HTMLWidgets.widget({
name: "plotly",
type: "output",

initialize: function(el, width, height){
initialize: function(el, width, height){
return {};
},

Expand All@@ -22,6 +23,40 @@ HTMLWidgets.widget({
} else {
Plotly.newPlot(el.id, x.data, x.layout);
}

var g = x.data[0].set;
var grp = crosstalk.group(g);

$('#'+el.id).on('plotly_click', function(event, data) {
// extract only the data we may want to access in R
var d = data.points.map(function(pt) {
var obj = {
curveNumber: pt.curveNumber,
pointNumber: pt.pointNumber,
x: pt.x,
y: pt.y
};
if (pt.data.hasOwnProperty("key")) {
if (typeof pt.pointNumber === "number") {
obj.key = pt.data.key[pt.pointNumber];
} else {
obj.key = pt.data.key[pt.pointNumber[0]][pt.pointNumber[1]];
} // TODO: can pointNumber be 3D?
}
return obj;
});

// tell crosstalk about click data so we can access it in R (and JS)
grp.var("plotly_click").set(d);
// TODO: provide visual clue that we've selected point(s)
// (it's possible this will be handled natively in plotlyjs...)
});

grp.var('plotly_click').on('change', function(e) {
console.log(e.value);
// TODO: if e.value.x != e.oldValue.x, then newPlot? Otherwise, restyle?
});

}

});
4 changes: 4 additions & 0 deletions inst/htmlwidgets/plotly.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,3 +3,7 @@ dependencies:
version: 1.2.1
src: "htmlwidgets/lib/plotlyjs"
script: plotly-latest.min.js
- name: jquery
version: 2.1.4
src: "htmlwidgets/lib/jquery"
script: jquery.min.js
6 changes: 6 additions & 0 deletions inst/plotlyjs.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,9 @@ download.file(
"https://raw.githubusercontent.com/plotly/plotly.js/master/LICENSE",
"inst/htmlwidgets/lib/plotlyjs/LICENSE"
)


download.file(
"https://code.jquery.com/jquery-2.1.4.min.js",
"inst/htmlwidgets/lib/jquery/jquery.min.js"
)
8 changes: 6 additions & 2 deletions man/plot_ly.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
905abb0
simple interface for binding events; add jQuery dep
cpsievert Nov 27, 2015
1e35205
callback can be character string
cpsievert Nov 27, 2015
19c2f32
export as.widget()
cpsievert Nov 27, 2015
5b4918b
first stab at crosstalk
cpsievert Nov 30, 2015
9f0ea43
fix shiny binding
cpsievert Dec 1, 2015
e33432b
fix height/width specification
cpsievert Dec 1, 2015
561db93
key instead of source/target
cpsievert Dec 1, 2015
d42dd01
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 2, 2015
d981b94
remove bind() since htmlwidgets will provide an official mechanism
cpsievert Dec 2, 2015
1a93c3b
document bind removal
cpsievert Dec 2, 2015
ae85b3a
document other previous changes
cpsievert Dec 2, 2015
23e7afa
cleanup js mess
cpsievert Dec 2, 2015
e4f9b08
add set argument for scoping
cpsievert Dec 2, 2015
ba9b57f
add some basic examples
cpsievert Dec 2, 2015
3e84aa8
install crosstalk; save toWidget for legacy reasons
cpsievert Dec 2, 2015
ebc365b
Update examples
cpsievert Dec 2, 2015
d0b6118
simplify logic, more sensible naming, try to pass data.points to shiny
cpsievert Dec 6, 2015
d180812
send a subset of th data.points object
cpsievert Dec 8, 2015
3663018
merge conflicts
cpsievert Dec 14, 2015
5583240
merge conflicts
cpsievert Dec 19, 2015
86f2fcc
merge conflicts
cpsievert Dec 23, 2015
379d57d
Merge branch 'feature/events' of https://github.com/ropensci/plotly i…
cpsievert Dec 23, 2015
7d4f0cb
merge conflicts
cpsievert Dec 23, 2015
20f502c
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
4061899
document
cpsievert Dec 23, 2015
e363ccc
update examples
cpsievert Dec 23, 2015
466de0b
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .Rbuildignore
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
.travis.yml
Karthik_local.R
playground/
Makefile
man-roxygen
man-roxygen/^.*\.Rproj$
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
R/.Rhistory
Rapp.history
/Karthik_local.R
playground/
*~
.Rhistory
.RData
Expand Down
1 change: 1 addition & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@ before_install:

install:
- ./travis-tool.sh install_deps
- ./travis-tool.sh install_github jcheng5/crosstalk

before_script:
- git config --global user.name "cpsievert"
Expand Down
1 change: 1 addition & 0 deletions DESCRIPTION
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ Imports:
viridis,
base64enc,
htmlwidgets,
crosstalk,
plyr
Suggests:
dplyr,
Expand Down
15 changes: 10 additions & 5 deletions R/plotly.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@
#' @param symbols A character vector of symbol types. Possible values:
#' 'dot', 'cross', 'diamond', 'square', 'triangle-down', 'triangle-left', 'triangle-right', 'triangle-up'
#' @param size A variable name or numeric vector to encode the size of markers.
#' @param key a selection variable for linked views
#' @param set share selections across this grouping variable.
#' @param width Width in pixels (optional, defaults to automatic sizing).
#' @param height Height in pixels (optional, defaults to automatic sizing).
#' @param inherit logical. Should future traces inherit properties from this initial trace?
Expand DownExpand Up@@ -64,9 +66,9 @@
#' }
#'
plot_ly <- function(data = data.frame(), ..., type = "scatter",
group, color, colors, symbol, symbols, size,
width = NULL, height = NULL, inherit = TRUE,
evaluate = FALSE) {
group, color, colors, symbol, symbols, size,
key, set = "A", width = NULL, height = NULL,
inherit = TRUE, evaluate = FALSE) {
# "native" plotly arguments
argz <- substitute(list(...))
# old arguments to this function that are no longer supported
Expand All@@ -83,16 +85,19 @@ plot_ly <- function(data = data.frame(), ..., type = "scatter",
if (!missing(symbol)) argz$symbol <- substitute(symbol)
if (!missing(symbols)) argz$symbols <- substitute(symbols)
if (!missing(size)) argz$size <- substitute(size)
if (!missing(key)) argz$key <- substitute(key)
# trace information
tr <- list(
type = type,
args = argz,
env = list2env(data), # environment in which to evaluate arguments
enclos = parent.frame(), # if objects aren't found in env, look here
inherit = inherit
inherit = inherit,
set = set
)
# plotly objects should always have a _list_ of trace(s)

p <- list(
# plotly objects should always have a _list_ of trace(s)
data = list(tr),
layout = NULL,
url = NULL,
Expand Down
1 change: 1 addition & 0 deletions R/print.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,6 +49,7 @@ as.widget <- function(x, ...) {
padding = 5,
browser.fill = TRUE
),
dependencies = crosstalk::dependencies,
...
)
}
Expand Down
34 changes: 34 additions & 0 deletions inst/examples/crosstalk.R
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
# access renderPlotly() selections on a shiny server
# https://github.com/cpsievert/shiny_apps/blob/master/plotlyCrosstalk/app.R

# TODO:
# (1) pass selections from another htmlwidget (rcdimple?) to renderPlotly()
# (2) crosstalk without shiny (see examples below)
# (3) define custom event behavior in JS from R?

library(plotly)
library(htmltools)

# click/show selects?
mtcars$gear <- factor(mtcars$gear)
mtcars$cyl <- factor(mtcars$cyl)
p1 <- plot_ly(mtcars, x = wt, y = mpg, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = wt, y = disp, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
# TODO: inline-block?
browsable(tagList(
as.widget(p1),
as.widget(p2)
))

library(dplyr)
m <- count(mtcars, cyl)
p1 <- plot_ly(m, x = cyl, y = n, type = "bar",
key = cyl, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = mpg, y = disp, mode = "markers",
key = cyl, set = "A", width = 400)
browsable(tagList(
as.widget(p1),
as.widget(p2)
))
37 changes: 37 additions & 0 deletions inst/htmlwidgets/lib/jquery/LICENSE.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
Copyright 2005, 2014 jQuery Foundation and other contributors,
https://jquery.org/

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery

The following license applies to all parts of this software except as
documented below:

====

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

====

All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.
4 changes: 4 additions & 0 deletions inst/htmlwidgets/lib/jquery/jquery.min.js

Large diffs are not rendered by default.

37 changes: 36 additions & 1 deletion inst/htmlwidgets/plotly.js
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@

HTMLWidgets.widget({
name: "plotly",
type: "output",

initialize: function(el, width, height){
initialize: function(el, width, height){
return {};
},

Expand All@@ -22,6 +23,40 @@ HTMLWidgets.widget({
} else {
Plotly.newPlot(el.id, x.data, x.layout);
}

var g = x.data[0].set;
var grp = crosstalk.group(g);

$('#'+el.id).on('plotly_click', function(event, data) {
// extract only the data we may want to access in R
var d = data.points.map(function(pt) {
var obj = {
curveNumber: pt.curveNumber,
pointNumber: pt.pointNumber,
x: pt.x,
y: pt.y
};
if (pt.data.hasOwnProperty("key")) {
if (typeof pt.pointNumber === "number") {
obj.key = pt.data.key[pt.pointNumber];
} else {
obj.key = pt.data.key[pt.pointNumber[0]][pt.pointNumber[1]];
} // TODO: can pointNumber be 3D?
}
return obj;
});

// tell crosstalk about click data so we can access it in R (and JS)
grp.var("plotly_click").set(d);
// TODO: provide visual clue that we've selected point(s)
// (it's possible this will be handled natively in plotlyjs...)
});

grp.var('plotly_click').on('change', function(e) {
console.log(e.value);
// TODO: if e.value.x != e.oldValue.x, then newPlot? Otherwise, restyle?
});

}

});
4 changes: 4 additions & 0 deletions inst/htmlwidgets/plotly.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,3 +3,7 @@ dependencies:
version: 1.2.1
src: "htmlwidgets/lib/plotlyjs"
script: plotly-latest.min.js
- name: jquery
version: 2.1.4
src: "htmlwidgets/lib/jquery"
script: jquery.min.js
6 changes: 6 additions & 0 deletions inst/plotlyjs.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,9 @@ download.file(
"https://raw.githubusercontent.com/plotly/plotly.js/master/LICENSE",
"inst/htmlwidgets/lib/plotlyjs/LICENSE"
)


download.file(
"https://code.jquery.com/jquery-2.1.4.min.js",
"inst/htmlwidgets/lib/jquery/jquery.min.js"
)
8 changes: 6 additions & 2 deletions man/plot_ly.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
905abb0
simple interface for binding events; add jQuery dep
cpsievert Nov 27, 2015
1e35205
callback can be character string
cpsievert Nov 27, 2015
19c2f32
export as.widget()
cpsievert Nov 27, 2015
5b4918b
first stab at crosstalk
cpsievert Nov 30, 2015
9f0ea43
fix shiny binding
cpsievert Dec 1, 2015
e33432b
fix height/width specification
cpsievert Dec 1, 2015
561db93
key instead of source/target
cpsievert Dec 1, 2015
d42dd01
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 2, 2015
d981b94
remove bind() since htmlwidgets will provide an official mechanism
cpsievert Dec 2, 2015
1a93c3b
document bind removal
cpsievert Dec 2, 2015
ae85b3a
document other previous changes
cpsievert Dec 2, 2015
23e7afa
cleanup js mess
cpsievert Dec 2, 2015
e4f9b08
add set argument for scoping
cpsievert Dec 2, 2015
ba9b57f
add some basic examples
cpsievert Dec 2, 2015
3e84aa8
install crosstalk; save toWidget for legacy reasons
cpsievert Dec 2, 2015
ebc365b
Update examples
cpsievert Dec 2, 2015
d0b6118
simplify logic, more sensible naming, try to pass data.points to shiny
cpsievert Dec 6, 2015
d180812
send a subset of th data.points object
cpsievert Dec 8, 2015
3663018
merge conflicts
cpsievert Dec 14, 2015
5583240
merge conflicts
cpsievert Dec 19, 2015
86f2fcc
merge conflicts
cpsievert Dec 23, 2015
379d57d
Merge branch 'feature/events' of https://github.com/ropensci/plotly i…
cpsievert Dec 23, 2015
7d4f0cb
merge conflicts
cpsievert Dec 23, 2015
20f502c
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
4061899
document
cpsievert Dec 23, 2015
e363ccc
update examples
cpsievert Dec 23, 2015
466de0b
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .Rbuildignore
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
.travis.yml
Karthik_local.R
playground/
Makefile
man-roxygen
man-roxygen/^.*\.Rproj$
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
R/.Rhistory
Rapp.history
/Karthik_local.R
playground/
*~
.Rhistory
.RData
Expand Down
1 change: 1 addition & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@ before_install:

install:
- ./travis-tool.sh install_deps
- ./travis-tool.sh install_github jcheng5/crosstalk

before_script:
- git config --global user.name "cpsievert"
Expand Down
1 change: 1 addition & 0 deletions DESCRIPTION
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ Imports:
viridis,
base64enc,
htmlwidgets,
crosstalk,
plyr
Suggests:
dplyr,
Expand Down
15 changes: 10 additions & 5 deletions R/plotly.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@
#' @param symbols A character vector of symbol types. Possible values:
#' 'dot', 'cross', 'diamond', 'square', 'triangle-down', 'triangle-left', 'triangle-right', 'triangle-up'
#' @param size A variable name or numeric vector to encode the size of markers.
#' @param key a selection variable for linked views
#' @param set share selections across this grouping variable.
#' @param width Width in pixels (optional, defaults to automatic sizing).
#' @param height Height in pixels (optional, defaults to automatic sizing).
#' @param inherit logical. Should future traces inherit properties from this initial trace?
Expand DownExpand Up@@ -64,9 +66,9 @@
#' }
#'
plot_ly <- function(data = data.frame(), ..., type = "scatter",
group, color, colors, symbol, symbols, size,
width = NULL, height = NULL, inherit = TRUE,
evaluate = FALSE) {
group, color, colors, symbol, symbols, size,
key, set = "A", width = NULL, height = NULL,
inherit = TRUE, evaluate = FALSE) {
# "native" plotly arguments
argz <- substitute(list(...))
# old arguments to this function that are no longer supported
Expand All@@ -83,16 +85,19 @@ plot_ly <- function(data = data.frame(), ..., type = "scatter",
if (!missing(symbol)) argz$symbol <- substitute(symbol)
if (!missing(symbols)) argz$symbols <- substitute(symbols)
if (!missing(size)) argz$size <- substitute(size)
if (!missing(key)) argz$key <- substitute(key)
# trace information
tr <- list(
type = type,
args = argz,
env = list2env(data), # environment in which to evaluate arguments
enclos = parent.frame(), # if objects aren't found in env, look here
inherit = inherit
inherit = inherit,
set = set
)
# plotly objects should always have a _list_ of trace(s)

p <- list(
# plotly objects should always have a _list_ of trace(s)
data = list(tr),
layout = NULL,
url = NULL,
Expand Down
1 change: 1 addition & 0 deletions R/print.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,6 +49,7 @@ as.widget <- function(x, ...) {
padding = 5,
browser.fill = TRUE
),
dependencies = crosstalk::dependencies,
...
)
}
Expand Down
34 changes: 34 additions & 0 deletions inst/examples/crosstalk.R
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
# access renderPlotly() selections on a shiny server
# https://github.com/cpsievert/shiny_apps/blob/master/plotlyCrosstalk/app.R

# TODO:
# (1) pass selections from another htmlwidget (rcdimple?) to renderPlotly()
# (2) crosstalk without shiny (see examples below)
# (3) define custom event behavior in JS from R?

library(plotly)
library(htmltools)

# click/show selects?
mtcars$gear <- factor(mtcars$gear)
mtcars$cyl <- factor(mtcars$cyl)
p1 <- plot_ly(mtcars, x = wt, y = mpg, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = wt, y = disp, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
# TODO: inline-block?
browsable(tagList(
as.widget(p1),
as.widget(p2)
))

library(dplyr)
m <- count(mtcars, cyl)
p1 <- plot_ly(m, x = cyl, y = n, type = "bar",
key = cyl, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = mpg, y = disp, mode = "markers",
key = cyl, set = "A", width = 400)
browsable(tagList(
as.widget(p1),
as.widget(p2)
))
37 changes: 37 additions & 0 deletions inst/htmlwidgets/lib/jquery/LICENSE.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
Copyright 2005, 2014 jQuery Foundation and other contributors,
https://jquery.org/

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery

The following license applies to all parts of this software except as
documented below:

====

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

====

All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.
4 changes: 4 additions & 0 deletions inst/htmlwidgets/lib/jquery/jquery.min.js

Large diffs are not rendered by default.

37 changes: 36 additions & 1 deletion inst/htmlwidgets/plotly.js
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@

HTMLWidgets.widget({
name: "plotly",
type: "output",

initialize: function(el, width, height){
initialize: function(el, width, height){
return {};
},

Expand All@@ -22,6 +23,40 @@ HTMLWidgets.widget({
} else {
Plotly.newPlot(el.id, x.data, x.layout);
}

var g = x.data[0].set;
var grp = crosstalk.group(g);

$('#'+el.id).on('plotly_click', function(event, data) {
// extract only the data we may want to access in R
var d = data.points.map(function(pt) {
var obj = {
curveNumber: pt.curveNumber,
pointNumber: pt.pointNumber,
x: pt.x,
y: pt.y
};
if (pt.data.hasOwnProperty("key")) {
if (typeof pt.pointNumber === "number") {
obj.key = pt.data.key[pt.pointNumber];
} else {
obj.key = pt.data.key[pt.pointNumber[0]][pt.pointNumber[1]];
} // TODO: can pointNumber be 3D?
}
return obj;
});

// tell crosstalk about click data so we can access it in R (and JS)
grp.var("plotly_click").set(d);
// TODO: provide visual clue that we've selected point(s)
// (it's possible this will be handled natively in plotlyjs...)
});

grp.var('plotly_click').on('change', function(e) {
console.log(e.value);
// TODO: if e.value.x != e.oldValue.x, then newPlot? Otherwise, restyle?
});

}

});
4 changes: 4 additions & 0 deletions inst/htmlwidgets/plotly.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,3 +3,7 @@ dependencies:
version: 1.2.1
src: "htmlwidgets/lib/plotlyjs"
script: plotly-latest.min.js
- name: jquery
version: 2.1.4
src: "htmlwidgets/lib/jquery"
script: jquery.min.js
6 changes: 6 additions & 0 deletions inst/plotlyjs.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,9 @@ download.file(
"https://raw.githubusercontent.com/plotly/plotly.js/master/LICENSE",
"inst/htmlwidgets/lib/plotlyjs/LICENSE"
)


download.file(
"https://code.jquery.com/jquery-2.1.4.min.js",
"inst/htmlwidgets/lib/jquery/jquery.min.js"
)
8 changes: 6 additions & 2 deletions man/plot_ly.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
905abb0
simple interface for binding events; add jQuery dep
cpsievert Nov 27, 2015
1e35205
callback can be character string
cpsievert Nov 27, 2015
19c2f32
export as.widget()
cpsievert Nov 27, 2015
5b4918b
first stab at crosstalk
cpsievert Nov 30, 2015
9f0ea43
fix shiny binding
cpsievert Dec 1, 2015
e33432b
fix height/width specification
cpsievert Dec 1, 2015
561db93
key instead of source/target
cpsievert Dec 1, 2015
d42dd01
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 2, 2015
d981b94
remove bind() since htmlwidgets will provide an official mechanism
cpsievert Dec 2, 2015
1a93c3b
document bind removal
cpsievert Dec 2, 2015
ae85b3a
document other previous changes
cpsievert Dec 2, 2015
23e7afa
cleanup js mess
cpsievert Dec 2, 2015
e4f9b08
add set argument for scoping
cpsievert Dec 2, 2015
ba9b57f
add some basic examples
cpsievert Dec 2, 2015
3e84aa8
install crosstalk; save toWidget for legacy reasons
cpsievert Dec 2, 2015
ebc365b
Update examples
cpsievert Dec 2, 2015
d0b6118
simplify logic, more sensible naming, try to pass data.points to shiny
cpsievert Dec 6, 2015
d180812
send a subset of th data.points object
cpsievert Dec 8, 2015
3663018
merge conflicts
cpsievert Dec 14, 2015
5583240
merge conflicts
cpsievert Dec 19, 2015
86f2fcc
merge conflicts
cpsievert Dec 23, 2015
379d57d
Merge branch 'feature/events' of https://github.com/ropensci/plotly i…
cpsievert Dec 23, 2015
7d4f0cb
merge conflicts
cpsievert Dec 23, 2015
20f502c
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
4061899
document
cpsievert Dec 23, 2015
e363ccc
update examples
cpsievert Dec 23, 2015
466de0b
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .Rbuildignore
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
.travis.yml
Karthik_local.R
playground/
Makefile
man-roxygen
man-roxygen/^.*\.Rproj$
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
R/.Rhistory
Rapp.history
/Karthik_local.R
playground/
*~
.Rhistory
.RData
Expand Down
1 change: 1 addition & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@ before_install:

install:
- ./travis-tool.sh install_deps
- ./travis-tool.sh install_github jcheng5/crosstalk

before_script:
- git config --global user.name "cpsievert"
Expand Down
1 change: 1 addition & 0 deletions DESCRIPTION
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ Imports:
viridis,
base64enc,
htmlwidgets,
crosstalk,
plyr
Suggests:
dplyr,
Expand Down
15 changes: 10 additions & 5 deletions R/plotly.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@
#' @param symbols A character vector of symbol types. Possible values:
#' 'dot', 'cross', 'diamond', 'square', 'triangle-down', 'triangle-left', 'triangle-right', 'triangle-up'
#' @param size A variable name or numeric vector to encode the size of markers.
#' @param key a selection variable for linked views
#' @param set share selections across this grouping variable.
#' @param width Width in pixels (optional, defaults to automatic sizing).
#' @param height Height in pixels (optional, defaults to automatic sizing).
#' @param inherit logical. Should future traces inherit properties from this initial trace?
Expand DownExpand Up@@ -64,9 +66,9 @@
#' }
#'
plot_ly <- function(data = data.frame(), ..., type = "scatter",
group, color, colors, symbol, symbols, size,
width = NULL, height = NULL, inherit = TRUE,
evaluate = FALSE) {
group, color, colors, symbol, symbols, size,
key, set = "A", width = NULL, height = NULL,
inherit = TRUE, evaluate = FALSE) {
# "native" plotly arguments
argz <- substitute(list(...))
# old arguments to this function that are no longer supported
Expand All@@ -83,16 +85,19 @@ plot_ly <- function(data = data.frame(), ..., type = "scatter",
if (!missing(symbol)) argz$symbol <- substitute(symbol)
if (!missing(symbols)) argz$symbols <- substitute(symbols)
if (!missing(size)) argz$size <- substitute(size)
if (!missing(key)) argz$key <- substitute(key)
# trace information
tr <- list(
type = type,
args = argz,
env = list2env(data), # environment in which to evaluate arguments
enclos = parent.frame(), # if objects aren't found in env, look here
inherit = inherit
inherit = inherit,
set = set
)
# plotly objects should always have a _list_ of trace(s)

p <- list(
# plotly objects should always have a _list_ of trace(s)
data = list(tr),
layout = NULL,
url = NULL,
Expand Down
1 change: 1 addition & 0 deletions R/print.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,6 +49,7 @@ as.widget <- function(x, ...) {
padding = 5,
browser.fill = TRUE
),
dependencies = crosstalk::dependencies,
...
)
}
Expand Down
34 changes: 34 additions & 0 deletions inst/examples/crosstalk.R
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
# access renderPlotly() selections on a shiny server
# https://github.com/cpsievert/shiny_apps/blob/master/plotlyCrosstalk/app.R

# TODO:
# (1) pass selections from another htmlwidget (rcdimple?) to renderPlotly()
# (2) crosstalk without shiny (see examples below)
# (3) define custom event behavior in JS from R?

library(plotly)
library(htmltools)

# click/show selects?
mtcars$gear <- factor(mtcars$gear)
mtcars$cyl <- factor(mtcars$cyl)
p1 <- plot_ly(mtcars, x = wt, y = mpg, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = wt, y = disp, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
# TODO: inline-block?
browsable(tagList(
as.widget(p1),
as.widget(p2)
))

library(dplyr)
m <- count(mtcars, cyl)
p1 <- plot_ly(m, x = cyl, y = n, type = "bar",
key = cyl, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = mpg, y = disp, mode = "markers",
key = cyl, set = "A", width = 400)
browsable(tagList(
as.widget(p1),
as.widget(p2)
))
37 changes: 37 additions & 0 deletions inst/htmlwidgets/lib/jquery/LICENSE.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
Copyright 2005, 2014 jQuery Foundation and other contributors,
https://jquery.org/

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery

The following license applies to all parts of this software except as
documented below:

====

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

====

All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.
4 changes: 4 additions & 0 deletions inst/htmlwidgets/lib/jquery/jquery.min.js

Large diffs are not rendered by default.

37 changes: 36 additions & 1 deletion inst/htmlwidgets/plotly.js
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@

HTMLWidgets.widget({
name: "plotly",
type: "output",

initialize: function(el, width, height){
initialize: function(el, width, height){
return {};
},

Expand All@@ -22,6 +23,40 @@ HTMLWidgets.widget({
} else {
Plotly.newPlot(el.id, x.data, x.layout);
}

var g = x.data[0].set;
var grp = crosstalk.group(g);

$('#'+el.id).on('plotly_click', function(event, data) {
// extract only the data we may want to access in R
var d = data.points.map(function(pt) {
var obj = {
curveNumber: pt.curveNumber,
pointNumber: pt.pointNumber,
x: pt.x,
y: pt.y
};
if (pt.data.hasOwnProperty("key")) {
if (typeof pt.pointNumber === "number") {
obj.key = pt.data.key[pt.pointNumber];
} else {
obj.key = pt.data.key[pt.pointNumber[0]][pt.pointNumber[1]];
} // TODO: can pointNumber be 3D?
}
return obj;
});

// tell crosstalk about click data so we can access it in R (and JS)
grp.var("plotly_click").set(d);
// TODO: provide visual clue that we've selected point(s)
// (it's possible this will be handled natively in plotlyjs...)
});

grp.var('plotly_click').on('change', function(e) {
console.log(e.value);
// TODO: if e.value.x != e.oldValue.x, then newPlot? Otherwise, restyle?
});

}

});
4 changes: 4 additions & 0 deletions inst/htmlwidgets/plotly.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,3 +3,7 @@ dependencies:
version: 1.2.1
src: "htmlwidgets/lib/plotlyjs"
script: plotly-latest.min.js
- name: jquery
version: 2.1.4
src: "htmlwidgets/lib/jquery"
script: jquery.min.js
6 changes: 6 additions & 0 deletions inst/plotlyjs.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,9 @@ download.file(
"https://raw.githubusercontent.com/plotly/plotly.js/master/LICENSE",
"inst/htmlwidgets/lib/plotlyjs/LICENSE"
)


download.file(
"https://code.jquery.com/jquery-2.1.4.min.js",
"inst/htmlwidgets/lib/jquery/jquery.min.js"
)
8 changes: 6 additions & 2 deletions man/plot_ly.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
905abb0
simple interface for binding events; add jQuery dep
cpsievert Nov 27, 2015
1e35205
callback can be character string
cpsievert Nov 27, 2015
19c2f32
export as.widget()
cpsievert Nov 27, 2015
5b4918b
first stab at crosstalk
cpsievert Nov 30, 2015
9f0ea43
fix shiny binding
cpsievert Dec 1, 2015
e33432b
fix height/width specification
cpsievert Dec 1, 2015
561db93
key instead of source/target
cpsievert Dec 1, 2015
d42dd01
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 2, 2015
d981b94
remove bind() since htmlwidgets will provide an official mechanism
cpsievert Dec 2, 2015
1a93c3b
document bind removal
cpsievert Dec 2, 2015
ae85b3a
document other previous changes
cpsievert Dec 2, 2015
23e7afa
cleanup js mess
cpsievert Dec 2, 2015
e4f9b08
add set argument for scoping
cpsievert Dec 2, 2015
ba9b57f
add some basic examples
cpsievert Dec 2, 2015
3e84aa8
install crosstalk; save toWidget for legacy reasons
cpsievert Dec 2, 2015
ebc365b
Update examples
cpsievert Dec 2, 2015
d0b6118
simplify logic, more sensible naming, try to pass data.points to shiny
cpsievert Dec 6, 2015
d180812
send a subset of th data.points object
cpsievert Dec 8, 2015
3663018
merge conflicts
cpsievert Dec 14, 2015
5583240
merge conflicts
cpsievert Dec 19, 2015
86f2fcc
merge conflicts
cpsievert Dec 23, 2015
379d57d
Merge branch 'feature/events' of https://github.com/ropensci/plotly i…
cpsievert Dec 23, 2015
7d4f0cb
merge conflicts
cpsievert Dec 23, 2015
20f502c
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
4061899
document
cpsievert Dec 23, 2015
e363ccc
update examples
cpsievert Dec 23, 2015
466de0b
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .Rbuildignore
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
.travis.yml
Karthik_local.R
playground/
Makefile
man-roxygen
man-roxygen/^.*\.Rproj$
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
R/.Rhistory
Rapp.history
/Karthik_local.R
playground/
*~
.Rhistory
.RData
Expand Down
1 change: 1 addition & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@ before_install:

install:
- ./travis-tool.sh install_deps
- ./travis-tool.sh install_github jcheng5/crosstalk

before_script:
- git config --global user.name "cpsievert"
Expand Down
1 change: 1 addition & 0 deletions DESCRIPTION
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ Imports:
viridis,
base64enc,
htmlwidgets,
crosstalk,
plyr
Suggests:
dplyr,
Expand Down
15 changes: 10 additions & 5 deletions R/plotly.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@
#' @param symbols A character vector of symbol types. Possible values:
#' 'dot', 'cross', 'diamond', 'square', 'triangle-down', 'triangle-left', 'triangle-right', 'triangle-up'
#' @param size A variable name or numeric vector to encode the size of markers.
#' @param key a selection variable for linked views
#' @param set share selections across this grouping variable.
#' @param width Width in pixels (optional, defaults to automatic sizing).
#' @param height Height in pixels (optional, defaults to automatic sizing).
#' @param inherit logical. Should future traces inherit properties from this initial trace?
Expand DownExpand Up@@ -64,9 +66,9 @@
#' }
#'
plot_ly <- function(data = data.frame(), ..., type = "scatter",
group, color, colors, symbol, symbols, size,
width = NULL, height = NULL, inherit = TRUE,
evaluate = FALSE) {
group, color, colors, symbol, symbols, size,
key, set = "A", width = NULL, height = NULL,
inherit = TRUE, evaluate = FALSE) {
# "native" plotly arguments
argz <- substitute(list(...))
# old arguments to this function that are no longer supported
Expand All@@ -83,16 +85,19 @@ plot_ly <- function(data = data.frame(), ..., type = "scatter",
if (!missing(symbol)) argz$symbol <- substitute(symbol)
if (!missing(symbols)) argz$symbols <- substitute(symbols)
if (!missing(size)) argz$size <- substitute(size)
if (!missing(key)) argz$key <- substitute(key)
# trace information
tr <- list(
type = type,
args = argz,
env = list2env(data), # environment in which to evaluate arguments
enclos = parent.frame(), # if objects aren't found in env, look here
inherit = inherit
inherit = inherit,
set = set
)
# plotly objects should always have a _list_ of trace(s)

p <- list(
# plotly objects should always have a _list_ of trace(s)
data = list(tr),
layout = NULL,
url = NULL,
Expand Down
1 change: 1 addition & 0 deletions R/print.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,6 +49,7 @@ as.widget <- function(x, ...) {
padding = 5,
browser.fill = TRUE
),
dependencies = crosstalk::dependencies,
...
)
}
Expand Down
34 changes: 34 additions & 0 deletions inst/examples/crosstalk.R
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
# access renderPlotly() selections on a shiny server
# https://github.com/cpsievert/shiny_apps/blob/master/plotlyCrosstalk/app.R

# TODO:
# (1) pass selections from another htmlwidget (rcdimple?) to renderPlotly()
# (2) crosstalk without shiny (see examples below)
# (3) define custom event behavior in JS from R?

library(plotly)
library(htmltools)

# click/show selects?
mtcars$gear <- factor(mtcars$gear)
mtcars$cyl <- factor(mtcars$cyl)
p1 <- plot_ly(mtcars, x = wt, y = mpg, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = wt, y = disp, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
# TODO: inline-block?
browsable(tagList(
as.widget(p1),
as.widget(p2)
))

library(dplyr)
m <- count(mtcars, cyl)
p1 <- plot_ly(m, x = cyl, y = n, type = "bar",
key = cyl, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = mpg, y = disp, mode = "markers",
key = cyl, set = "A", width = 400)
browsable(tagList(
as.widget(p1),
as.widget(p2)
))
37 changes: 37 additions & 0 deletions inst/htmlwidgets/lib/jquery/LICENSE.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
Copyright 2005, 2014 jQuery Foundation and other contributors,
https://jquery.org/

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery

The following license applies to all parts of this software except as
documented below:

====

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

====

All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.
4 changes: 4 additions & 0 deletions inst/htmlwidgets/lib/jquery/jquery.min.js

Large diffs are not rendered by default.

37 changes: 36 additions & 1 deletion inst/htmlwidgets/plotly.js
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@

HTMLWidgets.widget({
name: "plotly",
type: "output",

initialize: function(el, width, height){
initialize: function(el, width, height){
return {};
},

Expand All@@ -22,6 +23,40 @@ HTMLWidgets.widget({
} else {
Plotly.newPlot(el.id, x.data, x.layout);
}

var g = x.data[0].set;
var grp = crosstalk.group(g);

$('#'+el.id).on('plotly_click', function(event, data) {
// extract only the data we may want to access in R
var d = data.points.map(function(pt) {
var obj = {
curveNumber: pt.curveNumber,
pointNumber: pt.pointNumber,
x: pt.x,
y: pt.y
};
if (pt.data.hasOwnProperty("key")) {
if (typeof pt.pointNumber === "number") {
obj.key = pt.data.key[pt.pointNumber];
} else {
obj.key = pt.data.key[pt.pointNumber[0]][pt.pointNumber[1]];
} // TODO: can pointNumber be 3D?
}
return obj;
});

// tell crosstalk about click data so we can access it in R (and JS)
grp.var("plotly_click").set(d);
// TODO: provide visual clue that we've selected point(s)
// (it's possible this will be handled natively in plotlyjs...)
});

grp.var('plotly_click').on('change', function(e) {
console.log(e.value);
// TODO: if e.value.x != e.oldValue.x, then newPlot? Otherwise, restyle?
});

}

});
4 changes: 4 additions & 0 deletions inst/htmlwidgets/plotly.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,3 +3,7 @@ dependencies:
version: 1.2.1
src: "htmlwidgets/lib/plotlyjs"
script: plotly-latest.min.js
- name: jquery
version: 2.1.4
src: "htmlwidgets/lib/jquery"
script: jquery.min.js
6 changes: 6 additions & 0 deletions inst/plotlyjs.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,9 @@ download.file(
"https://raw.githubusercontent.com/plotly/plotly.js/master/LICENSE",
"inst/htmlwidgets/lib/plotlyjs/LICENSE"
)


download.file(
"https://code.jquery.com/jquery-2.1.4.min.js",
"inst/htmlwidgets/lib/jquery/jquery.min.js"
)
8 changes: 6 additions & 2 deletions man/plot_ly.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
905abb0
simple interface for binding events; add jQuery dep
cpsievert Nov 27, 2015
1e35205
callback can be character string
cpsievert Nov 27, 2015
19c2f32
export as.widget()
cpsievert Nov 27, 2015
5b4918b
first stab at crosstalk
cpsievert Nov 30, 2015
9f0ea43
fix shiny binding
cpsievert Dec 1, 2015
e33432b
fix height/width specification
cpsievert Dec 1, 2015
561db93
key instead of source/target
cpsievert Dec 1, 2015
d42dd01
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 2, 2015
d981b94
remove bind() since htmlwidgets will provide an official mechanism
cpsievert Dec 2, 2015
1a93c3b
document bind removal
cpsievert Dec 2, 2015
ae85b3a
document other previous changes
cpsievert Dec 2, 2015
23e7afa
cleanup js mess
cpsievert Dec 2, 2015
e4f9b08
add set argument for scoping
cpsievert Dec 2, 2015
ba9b57f
add some basic examples
cpsievert Dec 2, 2015
3e84aa8
install crosstalk; save toWidget for legacy reasons
cpsievert Dec 2, 2015
ebc365b
Update examples
cpsievert Dec 2, 2015
d0b6118
simplify logic, more sensible naming, try to pass data.points to shiny
cpsievert Dec 6, 2015
d180812
send a subset of th data.points object
cpsievert Dec 8, 2015
3663018
merge conflicts
cpsievert Dec 14, 2015
5583240
merge conflicts
cpsievert Dec 19, 2015
86f2fcc
merge conflicts
cpsievert Dec 23, 2015
379d57d
Merge branch 'feature/events' of https://github.com/ropensci/plotly i…
cpsievert Dec 23, 2015
7d4f0cb
merge conflicts
cpsievert Dec 23, 2015
20f502c
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
4061899
document
cpsievert Dec 23, 2015
e363ccc
update examples
cpsievert Dec 23, 2015
466de0b
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .Rbuildignore
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
.travis.yml
Karthik_local.R
playground/
Makefile
man-roxygen
man-roxygen/^.*\.Rproj$
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
R/.Rhistory
Rapp.history
/Karthik_local.R
playground/
*~
.Rhistory
.RData
Expand Down
1 change: 1 addition & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@ before_install:

install:
- ./travis-tool.sh install_deps
- ./travis-tool.sh install_github jcheng5/crosstalk

before_script:
- git config --global user.name "cpsievert"
Expand Down
1 change: 1 addition & 0 deletions DESCRIPTION
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ Imports:
viridis,
base64enc,
htmlwidgets,
crosstalk,
plyr
Suggests:
dplyr,
Expand Down
15 changes: 10 additions & 5 deletions R/plotly.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@
#' @param symbols A character vector of symbol types. Possible values:
#' 'dot', 'cross', 'diamond', 'square', 'triangle-down', 'triangle-left', 'triangle-right', 'triangle-up'
#' @param size A variable name or numeric vector to encode the size of markers.
#' @param key a selection variable for linked views
#' @param set share selections across this grouping variable.
#' @param width Width in pixels (optional, defaults to automatic sizing).
#' @param height Height in pixels (optional, defaults to automatic sizing).
#' @param inherit logical. Should future traces inherit properties from this initial trace?
Expand DownExpand Up@@ -64,9 +66,9 @@
#' }
#'
plot_ly <- function(data = data.frame(), ..., type = "scatter",
group, color, colors, symbol, symbols, size,
width = NULL, height = NULL, inherit = TRUE,
evaluate = FALSE) {
group, color, colors, symbol, symbols, size,
key, set = "A", width = NULL, height = NULL,
inherit = TRUE, evaluate = FALSE) {
# "native" plotly arguments
argz <- substitute(list(...))
# old arguments to this function that are no longer supported
Expand All@@ -83,16 +85,19 @@ plot_ly <- function(data = data.frame(), ..., type = "scatter",
if (!missing(symbol)) argz$symbol <- substitute(symbol)
if (!missing(symbols)) argz$symbols <- substitute(symbols)
if (!missing(size)) argz$size <- substitute(size)
if (!missing(key)) argz$key <- substitute(key)
# trace information
tr <- list(
type = type,
args = argz,
env = list2env(data), # environment in which to evaluate arguments
enclos = parent.frame(), # if objects aren't found in env, look here
inherit = inherit
inherit = inherit,
set = set
)
# plotly objects should always have a _list_ of trace(s)

p <- list(
# plotly objects should always have a _list_ of trace(s)
data = list(tr),
layout = NULL,
url = NULL,
Expand Down
1 change: 1 addition & 0 deletions R/print.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,6 +49,7 @@ as.widget <- function(x, ...) {
padding = 5,
browser.fill = TRUE
),
dependencies = crosstalk::dependencies,
...
)
}
Expand Down
34 changes: 34 additions & 0 deletions inst/examples/crosstalk.R
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
# access renderPlotly() selections on a shiny server
# https://github.com/cpsievert/shiny_apps/blob/master/plotlyCrosstalk/app.R

# TODO:
# (1) pass selections from another htmlwidget (rcdimple?) to renderPlotly()
# (2) crosstalk without shiny (see examples below)
# (3) define custom event behavior in JS from R?

library(plotly)
library(htmltools)

# click/show selects?
mtcars$gear <- factor(mtcars$gear)
mtcars$cyl <- factor(mtcars$cyl)
p1 <- plot_ly(mtcars, x = wt, y = mpg, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = wt, y = disp, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
# TODO: inline-block?
browsable(tagList(
as.widget(p1),
as.widget(p2)
))

library(dplyr)
m <- count(mtcars, cyl)
p1 <- plot_ly(m, x = cyl, y = n, type = "bar",
key = cyl, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = mpg, y = disp, mode = "markers",
key = cyl, set = "A", width = 400)
browsable(tagList(
as.widget(p1),
as.widget(p2)
))
37 changes: 37 additions & 0 deletions inst/htmlwidgets/lib/jquery/LICENSE.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
Copyright 2005, 2014 jQuery Foundation and other contributors,
https://jquery.org/

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery

The following license applies to all parts of this software except as
documented below:

====

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

====

All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.
4 changes: 4 additions & 0 deletions inst/htmlwidgets/lib/jquery/jquery.min.js

Large diffs are not rendered by default.

37 changes: 36 additions & 1 deletion inst/htmlwidgets/plotly.js
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@

HTMLWidgets.widget({
name: "plotly",
type: "output",

initialize: function(el, width, height){
initialize: function(el, width, height){
return {};
},

Expand All@@ -22,6 +23,40 @@ HTMLWidgets.widget({
} else {
Plotly.newPlot(el.id, x.data, x.layout);
}

var g = x.data[0].set;
var grp = crosstalk.group(g);

$('#'+el.id).on('plotly_click', function(event, data) {
// extract only the data we may want to access in R
var d = data.points.map(function(pt) {
var obj = {
curveNumber: pt.curveNumber,
pointNumber: pt.pointNumber,
x: pt.x,
y: pt.y
};
if (pt.data.hasOwnProperty("key")) {
if (typeof pt.pointNumber === "number") {
obj.key = pt.data.key[pt.pointNumber];
} else {
obj.key = pt.data.key[pt.pointNumber[0]][pt.pointNumber[1]];
} // TODO: can pointNumber be 3D?
}
return obj;
});

// tell crosstalk about click data so we can access it in R (and JS)
grp.var("plotly_click").set(d);
// TODO: provide visual clue that we've selected point(s)
// (it's possible this will be handled natively in plotlyjs...)
});

grp.var('plotly_click').on('change', function(e) {
console.log(e.value);
// TODO: if e.value.x != e.oldValue.x, then newPlot? Otherwise, restyle?
});

}

});
4 changes: 4 additions & 0 deletions inst/htmlwidgets/plotly.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,3 +3,7 @@ dependencies:
version: 1.2.1
src: "htmlwidgets/lib/plotlyjs"
script: plotly-latest.min.js
- name: jquery
version: 2.1.4
src: "htmlwidgets/lib/jquery"
script: jquery.min.js
6 changes: 6 additions & 0 deletions inst/plotlyjs.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,9 @@ download.file(
"https://raw.githubusercontent.com/plotly/plotly.js/master/LICENSE",
"inst/htmlwidgets/lib/plotlyjs/LICENSE"
)


download.file(
"https://code.jquery.com/jquery-2.1.4.min.js",
"inst/htmlwidgets/lib/jquery/jquery.min.js"
)
8 changes: 6 additions & 2 deletions man/plot_ly.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
905abb0
simple interface for binding events; add jQuery dep
cpsievert Nov 27, 2015
1e35205
callback can be character string
cpsievert Nov 27, 2015
19c2f32
export as.widget()
cpsievert Nov 27, 2015
5b4918b
first stab at crosstalk
cpsievert Nov 30, 2015
9f0ea43
fix shiny binding
cpsievert Dec 1, 2015
e33432b
fix height/width specification
cpsievert Dec 1, 2015
561db93
key instead of source/target
cpsievert Dec 1, 2015
d42dd01
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 2, 2015
d981b94
remove bind() since htmlwidgets will provide an official mechanism
cpsievert Dec 2, 2015
1a93c3b
document bind removal
cpsievert Dec 2, 2015
ae85b3a
document other previous changes
cpsievert Dec 2, 2015
23e7afa
cleanup js mess
cpsievert Dec 2, 2015
e4f9b08
add set argument for scoping
cpsievert Dec 2, 2015
ba9b57f
add some basic examples
cpsievert Dec 2, 2015
3e84aa8
install crosstalk; save toWidget for legacy reasons
cpsievert Dec 2, 2015
ebc365b
Update examples
cpsievert Dec 2, 2015
d0b6118
simplify logic, more sensible naming, try to pass data.points to shiny
cpsievert Dec 6, 2015
d180812
send a subset of th data.points object
cpsievert Dec 8, 2015
3663018
merge conflicts
cpsievert Dec 14, 2015
5583240
merge conflicts
cpsievert Dec 19, 2015
86f2fcc
merge conflicts
cpsievert Dec 23, 2015
379d57d
Merge branch 'feature/events' of https://github.com/ropensci/plotly i…
cpsievert Dec 23, 2015
7d4f0cb
merge conflicts
cpsievert Dec 23, 2015
20f502c
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
4061899
document
cpsievert Dec 23, 2015
e363ccc
update examples
cpsievert Dec 23, 2015
466de0b
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .Rbuildignore
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
.travis.yml
Karthik_local.R
playground/
Makefile
man-roxygen
man-roxygen/^.*\.Rproj$
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
R/.Rhistory
Rapp.history
/Karthik_local.R
playground/
*~
.Rhistory
.RData
Expand Down
1 change: 1 addition & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@ before_install:

install:
- ./travis-tool.sh install_deps
- ./travis-tool.sh install_github jcheng5/crosstalk

before_script:
- git config --global user.name "cpsievert"
Expand Down
1 change: 1 addition & 0 deletions DESCRIPTION
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ Imports:
viridis,
base64enc,
htmlwidgets,
crosstalk,
plyr
Suggests:
dplyr,
Expand Down
15 changes: 10 additions & 5 deletions R/plotly.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@
#' @param symbols A character vector of symbol types. Possible values:
#' 'dot', 'cross', 'diamond', 'square', 'triangle-down', 'triangle-left', 'triangle-right', 'triangle-up'
#' @param size A variable name or numeric vector to encode the size of markers.
#' @param key a selection variable for linked views
#' @param set share selections across this grouping variable.
#' @param width Width in pixels (optional, defaults to automatic sizing).
#' @param height Height in pixels (optional, defaults to automatic sizing).
#' @param inherit logical. Should future traces inherit properties from this initial trace?
Expand DownExpand Up@@ -64,9 +66,9 @@
#' }
#'
plot_ly <- function(data = data.frame(), ..., type = "scatter",
group, color, colors, symbol, symbols, size,
width = NULL, height = NULL, inherit = TRUE,
evaluate = FALSE) {
group, color, colors, symbol, symbols, size,
key, set = "A", width = NULL, height = NULL,
inherit = TRUE, evaluate = FALSE) {
# "native" plotly arguments
argz <- substitute(list(...))
# old arguments to this function that are no longer supported
Expand All@@ -83,16 +85,19 @@ plot_ly <- function(data = data.frame(), ..., type = "scatter",
if (!missing(symbol)) argz$symbol <- substitute(symbol)
if (!missing(symbols)) argz$symbols <- substitute(symbols)
if (!missing(size)) argz$size <- substitute(size)
if (!missing(key)) argz$key <- substitute(key)
# trace information
tr <- list(
type = type,
args = argz,
env = list2env(data), # environment in which to evaluate arguments
enclos = parent.frame(), # if objects aren't found in env, look here
inherit = inherit
inherit = inherit,
set = set
)
# plotly objects should always have a _list_ of trace(s)

p <- list(
# plotly objects should always have a _list_ of trace(s)
data = list(tr),
layout = NULL,
url = NULL,
Expand Down
1 change: 1 addition & 0 deletions R/print.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,6 +49,7 @@ as.widget <- function(x, ...) {
padding = 5,
browser.fill = TRUE
),
dependencies = crosstalk::dependencies,
...
)
}
Expand Down
34 changes: 34 additions & 0 deletions inst/examples/crosstalk.R
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
# access renderPlotly() selections on a shiny server
# https://github.com/cpsievert/shiny_apps/blob/master/plotlyCrosstalk/app.R

# TODO:
# (1) pass selections from another htmlwidget (rcdimple?) to renderPlotly()
# (2) crosstalk without shiny (see examples below)
# (3) define custom event behavior in JS from R?

library(plotly)
library(htmltools)

# click/show selects?
mtcars$gear <- factor(mtcars$gear)
mtcars$cyl <- factor(mtcars$cyl)
p1 <- plot_ly(mtcars, x = wt, y = mpg, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = wt, y = disp, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
# TODO: inline-block?
browsable(tagList(
as.widget(p1),
as.widget(p2)
))

library(dplyr)
m <- count(mtcars, cyl)
p1 <- plot_ly(m, x = cyl, y = n, type = "bar",
key = cyl, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = mpg, y = disp, mode = "markers",
key = cyl, set = "A", width = 400)
browsable(tagList(
as.widget(p1),
as.widget(p2)
))
37 changes: 37 additions & 0 deletions inst/htmlwidgets/lib/jquery/LICENSE.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
Copyright 2005, 2014 jQuery Foundation and other contributors,
https://jquery.org/

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery

The following license applies to all parts of this software except as
documented below:

====

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

====

All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.
4 changes: 4 additions & 0 deletions inst/htmlwidgets/lib/jquery/jquery.min.js

Large diffs are not rendered by default.

37 changes: 36 additions & 1 deletion inst/htmlwidgets/plotly.js
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@

HTMLWidgets.widget({
name: "plotly",
type: "output",

initialize: function(el, width, height){
initialize: function(el, width, height){
return {};
},

Expand All@@ -22,6 +23,40 @@ HTMLWidgets.widget({
} else {
Plotly.newPlot(el.id, x.data, x.layout);
}

var g = x.data[0].set;
var grp = crosstalk.group(g);

$('#'+el.id).on('plotly_click', function(event, data) {
// extract only the data we may want to access in R
var d = data.points.map(function(pt) {
var obj = {
curveNumber: pt.curveNumber,
pointNumber: pt.pointNumber,
x: pt.x,
y: pt.y
};
if (pt.data.hasOwnProperty("key")) {
if (typeof pt.pointNumber === "number") {
obj.key = pt.data.key[pt.pointNumber];
} else {
obj.key = pt.data.key[pt.pointNumber[0]][pt.pointNumber[1]];
} // TODO: can pointNumber be 3D?
}
return obj;
});

// tell crosstalk about click data so we can access it in R (and JS)
grp.var("plotly_click").set(d);
// TODO: provide visual clue that we've selected point(s)
// (it's possible this will be handled natively in plotlyjs...)
});

grp.var('plotly_click').on('change', function(e) {
console.log(e.value);
// TODO: if e.value.x != e.oldValue.x, then newPlot? Otherwise, restyle?
});

}

});
4 changes: 4 additions & 0 deletions inst/htmlwidgets/plotly.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,3 +3,7 @@ dependencies:
version: 1.2.1
src: "htmlwidgets/lib/plotlyjs"
script: plotly-latest.min.js
- name: jquery
version: 2.1.4
src: "htmlwidgets/lib/jquery"
script: jquery.min.js
6 changes: 6 additions & 0 deletions inst/plotlyjs.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,9 @@ download.file(
"https://raw.githubusercontent.com/plotly/plotly.js/master/LICENSE",
"inst/htmlwidgets/lib/plotlyjs/LICENSE"
)


download.file(
"https://code.jquery.com/jquery-2.1.4.min.js",
"inst/htmlwidgets/lib/jquery/jquery.min.js"
)
8 changes: 6 additions & 2 deletions man/plot_ly.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
905abb0
simple interface for binding events; add jQuery dep
cpsievert Nov 27, 2015
1e35205
callback can be character string
cpsievert Nov 27, 2015
19c2f32
export as.widget()
cpsievert Nov 27, 2015
5b4918b
first stab at crosstalk
cpsievert Nov 30, 2015
9f0ea43
fix shiny binding
cpsievert Dec 1, 2015
e33432b
fix height/width specification
cpsievert Dec 1, 2015
561db93
key instead of source/target
cpsievert Dec 1, 2015
d42dd01
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 2, 2015
d981b94
remove bind() since htmlwidgets will provide an official mechanism
cpsievert Dec 2, 2015
1a93c3b
document bind removal
cpsievert Dec 2, 2015
ae85b3a
document other previous changes
cpsievert Dec 2, 2015
23e7afa
cleanup js mess
cpsievert Dec 2, 2015
e4f9b08
add set argument for scoping
cpsievert Dec 2, 2015
ba9b57f
add some basic examples
cpsievert Dec 2, 2015
3e84aa8
install crosstalk; save toWidget for legacy reasons
cpsievert Dec 2, 2015
ebc365b
Update examples
cpsievert Dec 2, 2015
d0b6118
simplify logic, more sensible naming, try to pass data.points to shiny
cpsievert Dec 6, 2015
d180812
send a subset of th data.points object
cpsievert Dec 8, 2015
3663018
merge conflicts
cpsievert Dec 14, 2015
5583240
merge conflicts
cpsievert Dec 19, 2015
86f2fcc
merge conflicts
cpsievert Dec 23, 2015
379d57d
Merge branch 'feature/events' of https://github.com/ropensci/plotly i…
cpsievert Dec 23, 2015
7d4f0cb
merge conflicts
cpsievert Dec 23, 2015
20f502c
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
4061899
document
cpsievert Dec 23, 2015
e363ccc
update examples
cpsievert Dec 23, 2015
466de0b
Merge branch 'master' of https://github.com/ropensci/plotly into feat…
cpsievert Dec 23, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .Rbuildignore
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
.travis.yml
Karthik_local.R
playground/
Makefile
man-roxygen
man-roxygen/^.*\.Rproj$
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
R/.Rhistory
Rapp.history
/Karthik_local.R
playground/
*~
.Rhistory
.RData
Expand Down
1 change: 1 addition & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@ before_install:

install:
- ./travis-tool.sh install_deps
- ./travis-tool.sh install_github jcheng5/crosstalk

before_script:
- git config --global user.name "cpsievert"
Expand Down
1 change: 1 addition & 0 deletions DESCRIPTION
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ Imports:
viridis,
base64enc,
htmlwidgets,
crosstalk,
plyr
Suggests:
dplyr,
Expand Down
15 changes: 10 additions & 5 deletions R/plotly.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@
#' @param symbols A character vector of symbol types. Possible values:
#' 'dot', 'cross', 'diamond', 'square', 'triangle-down', 'triangle-left', 'triangle-right', 'triangle-up'
#' @param size A variable name or numeric vector to encode the size of markers.
#' @param key a selection variable for linked views
#' @param set share selections across this grouping variable.
#' @param width Width in pixels (optional, defaults to automatic sizing).
#' @param height Height in pixels (optional, defaults to automatic sizing).
#' @param inherit logical. Should future traces inherit properties from this initial trace?
Expand DownExpand Up@@ -64,9 +66,9 @@
#' }
#'
plot_ly <- function(data = data.frame(), ..., type = "scatter",
group, color, colors, symbol, symbols, size,
width = NULL, height = NULL, inherit = TRUE,
evaluate = FALSE) {
group, color, colors, symbol, symbols, size,
key, set = "A", width = NULL, height = NULL,
inherit = TRUE, evaluate = FALSE) {
# "native" plotly arguments
argz <- substitute(list(...))
# old arguments to this function that are no longer supported
Expand All@@ -83,16 +85,19 @@ plot_ly <- function(data = data.frame(), ..., type = "scatter",
if (!missing(symbol)) argz$symbol <- substitute(symbol)
if (!missing(symbols)) argz$symbols <- substitute(symbols)
if (!missing(size)) argz$size <- substitute(size)
if (!missing(key)) argz$key <- substitute(key)
# trace information
tr <- list(
type = type,
args = argz,
env = list2env(data), # environment in which to evaluate arguments
enclos = parent.frame(), # if objects aren't found in env, look here
inherit = inherit
inherit = inherit,
set = set
)
# plotly objects should always have a _list_ of trace(s)

p <- list(
# plotly objects should always have a _list_ of trace(s)
data = list(tr),
layout = NULL,
url = NULL,
Expand Down
1 change: 1 addition & 0 deletions R/print.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -49,6 +49,7 @@ as.widget <- function(x, ...) {
padding = 5,
browser.fill = TRUE
),
dependencies = crosstalk::dependencies,
...
)
}
Expand Down
34 changes: 34 additions & 0 deletions inst/examples/crosstalk.R
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
# access renderPlotly() selections on a shiny server
# https://github.com/cpsievert/shiny_apps/blob/master/plotlyCrosstalk/app.R

# TODO:
# (1) pass selections from another htmlwidget (rcdimple?) to renderPlotly()
# (2) crosstalk without shiny (see examples below)
# (3) define custom event behavior in JS from R?

library(plotly)
library(htmltools)

# click/show selects?
mtcars$gear <- factor(mtcars$gear)
mtcars$cyl <- factor(mtcars$cyl)
p1 <- plot_ly(mtcars, x = wt, y = mpg, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = wt, y = disp, color = gear, mode = "markers",
key = gear, set = "A", width = 400)
# TODO: inline-block?
browsable(tagList(
as.widget(p1),
as.widget(p2)
))

library(dplyr)
m <- count(mtcars, cyl)
p1 <- plot_ly(m, x = cyl, y = n, type = "bar",
key = cyl, set = "A", width = 400)
p2 <- plot_ly(mtcars, x = mpg, y = disp, mode = "markers",
key = cyl, set = "A", width = 400)
browsable(tagList(
as.widget(p1),
as.widget(p2)
))
37 changes: 37 additions & 0 deletions inst/htmlwidgets/lib/jquery/LICENSE.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
Copyright 2005, 2014 jQuery Foundation and other contributors,
https://jquery.org/

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery

The following license applies to all parts of this software except as
documented below:

====

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

====

All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.
4 changes: 4 additions & 0 deletions inst/htmlwidgets/lib/jquery/jquery.min.js

Large diffs are not rendered by default.

37 changes: 36 additions & 1 deletion inst/htmlwidgets/plotly.js
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@

HTMLWidgets.widget({
name: "plotly",
type: "output",

initialize: function(el, width, height){
initialize: function(el, width, height){
return {};
},

Expand All@@ -22,6 +23,40 @@ HTMLWidgets.widget({
} else {
Plotly.newPlot(el.id, x.data, x.layout);
}

var g = x.data[0].set;
var grp = crosstalk.group(g);

$('#'+el.id).on('plotly_click', function(event, data) {
// extract only the data we may want to access in R
var d = data.points.map(function(pt) {
var obj = {
curveNumber: pt.curveNumber,
pointNumber: pt.pointNumber,
x: pt.x,
y: pt.y
};
if (pt.data.hasOwnProperty("key")) {
if (typeof pt.pointNumber === "number") {
obj.key = pt.data.key[pt.pointNumber];
} else {
obj.key = pt.data.key[pt.pointNumber[0]][pt.pointNumber[1]];
} // TODO: can pointNumber be 3D?
}
return obj;
});

// tell crosstalk about click data so we can access it in R (and JS)
grp.var("plotly_click").set(d);
// TODO: provide visual clue that we've selected point(s)
// (it's possible this will be handled natively in plotlyjs...)
});

grp.var('plotly_click').on('change', function(e) {
console.log(e.value);
// TODO: if e.value.x != e.oldValue.x, then newPlot? Otherwise, restyle?
});

}

});
4 changes: 4 additions & 0 deletions inst/htmlwidgets/plotly.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,3 +3,7 @@ dependencies:
version: 1.2.1
src: "htmlwidgets/lib/plotlyjs"
script: plotly-latest.min.js
- name: jquery
version: 2.1.4
src: "htmlwidgets/lib/jquery"
script: jquery.min.js
6 changes: 6 additions & 0 deletions inst/plotlyjs.R
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,9 @@ download.file(
"https://raw.githubusercontent.com/plotly/plotly.js/master/LICENSE",
"inst/htmlwidgets/lib/plotlyjs/LICENSE"
)


download.file(
"https://code.jquery.com/jquery-2.1.4.min.js",
"inst/htmlwidgets/lib/jquery/jquery.min.js"
)
8 changes: 6 additions & 2 deletions man/plot_ly.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.