Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

crosstalk integration #312

Closed
wants to merge 27 commits into from
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 number Diff line number Diff 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 number Diff line number Diff 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 number Diff line number Diff 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 number Diff line number Diff 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 number Diff line number Diff 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 Down Expand 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 number Diff line number Diff 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 number Diff line number Diff 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 number Diff line number Diff 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 number Diff line number Diff 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 number Diff line number Diff 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 number Diff line number Diff 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.