Skip to content

Commit 10c3a78

Browse files
committed
Proper registration plotly methods for dplyr generics
1 parent 0fd2d87 commit 10c3a78

File tree

10 files changed

+202
-110
lines changed

10 files changed

+202
-110
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ Suggests:
7575
forcats,
7676
thematic
7777
LazyData: true
78-
RoxygenNote: 7.1.0
78+
RoxygenNote: 7.1.1
7979
Encoding: UTF-8
8080
Roxygen: list(markdown = TRUE)
8181
Remotes:

NAMESPACE

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@
33
S3method(api_create,data.frame)
44
S3method(api_create,ggplot)
55
S3method(api_create,plotly)
6-
S3method(arrange_,plotly)
7-
S3method(distinct_,plotly)
8-
S3method(do_,plotly)
96
S3method(embed_notebook,plotly)
10-
S3method(filter_,plotly)
117
S3method(fortify,SharedData)
128
S3method(geom2trace,GeomBar)
139
S3method(geom2trace,GeomBlank)
@@ -25,12 +21,9 @@ S3method(ggplotly,"NULL")
2521
S3method(ggplotly,ggmatrix)
2622
S3method(ggplotly,ggplot)
2723
S3method(ggplotly,plotly)
28-
S3method(group_by_,plotly)
29-
S3method(groups,plotly)
3024
S3method(layout,matrix)
3125
S3method(layout,plotly)
3226
S3method(layout,shiny.tag.list)
33-
S3method(mutate_,plotly)
3427
S3method(plotly_build,"NULL")
3528
S3method(plotly_build,gg)
3629
S3method(plotly_build,list)
@@ -40,10 +33,6 @@ S3method(print,api_grid)
4033
S3method(print,api_grid_local)
4134
S3method(print,api_plot)
4235
S3method(print,plotly_data)
43-
S3method(rename_,plotly)
44-
S3method(select_,plotly)
45-
S3method(slice_,plotly)
46-
S3method(summarise_,plotly)
4736
S3method(to_basic,GeomAbline)
4837
S3method(to_basic,GeomAnnotationMap)
4938
S3method(to_basic,GeomArea)
@@ -78,8 +67,6 @@ S3method(to_basic,GeomTile)
7867
S3method(to_basic,GeomViolin)
7968
S3method(to_basic,GeomVline)
8069
S3method(to_basic,default)
81-
S3method(transmute_,plotly)
82-
S3method(ungroup,plotly)
8370
export("%>%")
8471
export(TeX)
8572
export(add_annotations)

R/onLoad.R

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
.onLoad <- function(...) {
2+
# These generics are defined in R/plotly_data.R
3+
dplyr_generics <- c(
4+
"groups", "ungroup", "group_by", "summarise", "mutate", "do", "arrange",
5+
"select", "filter", "distinct", "slice", "rename", "transmute"
6+
)
7+
for (generic in dplyr_generics) {
8+
register_s3_method("dplyr", generic, "plotly")
9+
if (generic %in% c("groups", "ungroup")) {
10+
next
11+
}
12+
register_s3_method("dplyr", paste0(generic, "_"), "plotly")
13+
}
14+
}
15+
16+
# copy/pasta from shiny:::register_s3_method
17+
register_s3_method <- function(pkg, generic, class, fun = NULL) {
18+
stopifnot(is.character(pkg), length(pkg) == 1)
19+
stopifnot(is.character(generic), length(generic) == 1)
20+
stopifnot(is.character(class), length(class) == 1)
21+
22+
if (is.null(fun)) {
23+
fun <- get(paste0(generic, ".", class), envir = parent.frame())
24+
} else {
25+
stopifnot(is.function(fun))
26+
}
27+
28+
if (pkg %in% loadedNamespaces()) {
29+
registerS3method(generic, class, fun, envir = asNamespace(pkg))
30+
}
31+
32+
# Always register hook in case pkg is loaded at some
33+
# point the future (or, potentially, but less commonly,
34+
# unloaded & reloaded)
35+
setHook(
36+
packageEvent(pkg, "onLoad"),
37+
function(...) {
38+
registerS3method(generic, class, fun, envir = asNamespace(pkg))
39+
}
40+
)
41+
}

R/plotly_data.R

Lines changed: 105 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -104,125 +104,161 @@ highlight_key <- function(...) {
104104
crosstalk::SharedData$new(...)
105105
}
106106

107+
# ---------------------------------------------------------------------------
108+
# dplyr methods
109+
# ---------------------------------------------------------------------------
110+
107111
#' @rdname plotly_data
108-
#' @export
109112
groups.plotly <- function(x) {
110-
dplyr::groups(plotly_data(x))
113+
groups(plotly_data(x))
111114
}
112115

113116
#' @rdname plotly_data
114-
#' @export
115117
ungroup.plotly <- function(x, ...) {
116-
d <- dplyr::ungroup(plotly_data(x))
118+
d <- ungroup(plotly_data(x), ...)
117119
add_data(x, d)
118120
}
119121

120122
#' @rdname plotly_data
121-
#' @export
122-
group_by_.plotly <- function(.data, ..., .dots, add = FALSE) {
123-
d <- plotly_data(.data)
124-
additional_args <- dots_as_quosures(lazyeval::all_dots(.dots, ...))
125-
d2 <- group_by_add(d, !!!additional_args, add = add)
123+
group_by.plotly <- function(.data, ...) {
124+
d <- group_by(plotly_data(.data), ...)
125+
if (crosstalk_key() %in% names(d)) {
126+
d <- group_by_add(d, !!rlang::sym(crosstalk_key()), add = TRUE)
127+
}
128+
add_data(.data, d)
129+
}
130+
131+
#' @rdname plotly_data
132+
mutate.plotly <- function(.data, ...) {
133+
d <- mutate(plotly_data(.data), ...)
134+
add_data(.data, d)
135+
}
136+
137+
#' @rdname plotly_data
138+
do.plotly <- function(.data, ...) {
139+
d <- do(plotly_data(.data), ...)
140+
add_data(.data, d)
141+
}
142+
143+
#' @rdname plotly_data
144+
summarise.plotly <- function(.data, ...) {
145+
d <- summarise(plotly_data(.data), ...)
146+
add_data(.data, d)
147+
}
148+
149+
#' @rdname plotly_data
150+
arrange.plotly <- function(.data, ...) {
151+
d <- arrange(plotly_data(.data), ...)
152+
add_data(.data, d)
153+
}
154+
155+
#' @rdname plotly_data
156+
select.plotly <- function(.data, ...) {
157+
d <- select(plotly_data(.data), ...)
158+
add_data(.data, d)
159+
}
160+
161+
#' @rdname plotly_data
162+
filter.plotly <- function(.data, ...) {
163+
d <- filter(plotly_data(.data), ...)
164+
add_data(.data, d)
165+
}
166+
167+
#' @rdname plotly_data
168+
distinct.plotly <- function(.data, ...) {
169+
d <- distinct(plotly_data(.data), ...)
170+
add_data(.data, d)
171+
}
172+
173+
#' @rdname plotly_data
174+
slice.plotly <- function(.data, ...) {
175+
d <- slice(plotly_data(.data), ...)
176+
add_data(.data, d)
177+
}
178+
179+
#' @rdname plotly_data
180+
rename.plotly <- function(.data, ...) {
181+
d <- rename(plotly_data(.data), ...)
182+
add_data(.data, d)
183+
}
184+
185+
#' @rdname plotly_data
186+
transmute.plotly <- function(.data, ...) {
187+
d <- transmute(plotly_data(.data), ...)
188+
add_data(.data, d)
189+
}
190+
191+
# ------------------------------------------------------------
192+
# Deprecated dplyr non-nse generics
193+
# ------------------------------------------------------------
194+
195+
#' @rdname plotly_data
196+
group_by_.plotly <- function(.data, ...) {
197+
d <- group_by_(plotly_data(.data), ...)
126198
# add crosstalk key as a group (to enable examples like demos/highlight-pipeline.R)
127199
if (crosstalk_key() %in% names(d)) {
128-
d2 <- group_by_add(d2, !!rlang::sym(crosstalk_key()), add = TRUE)
200+
d <- group_by_add(d, !!rlang::sym(crosstalk_key()), add = TRUE)
129201
}
130-
add_data(.data, d2)
202+
add_data(.data, d)
131203
}
132204

133205
#' @rdname plotly_data
134-
#' @export
135-
summarise_.plotly <- function(.data, ..., .dots) {
136-
d <- plotly_data(.data)
137-
additional_args <- dots_as_quosures(lazyeval::all_dots(.dots, ...))
138-
d <- dplyr::summarise(d, !!!additional_args)
206+
mutate_.plotly <- function(.data, ...) {
207+
d <- mutate_(plotly_data(.data), ...)
139208
add_data(.data, d)
140209
}
141210

142211
#' @rdname plotly_data
143-
#' @export
144-
mutate_.plotly <- function(.data, ..., .dots) {
145-
d <- plotly_data(.data)
146-
dotz <- lazyeval::all_dots(.dots, ...)
147-
# '.' in a pipeline should really reference the data!!
148-
lapply(dotz, function(x) { assign(".", d, x$env) })
149-
set <- attr(d, "set")
150-
d <- dplyr::mutate(d, !!!dots_as_quosures(dotz))
151-
add_data(.data, structure(d, set = set))
212+
do_.plotly <- function(.data, ...) {
213+
d <- do_(plotly_data(.data), ...)
214+
add_data(.data, d)
152215
}
153216

154217
#' @rdname plotly_data
155-
#' @export
156-
do_.plotly <- function(.data, ..., .dots) {
157-
d <- plotly_data(.data)
158-
dotz <- lazyeval::all_dots(.dots, ...)
159-
# '.' in a pipeline should really reference the data!!
160-
lapply(dotz, function(x) { assign(".", d, x$env) })
161-
set <- attr(d, "set")
162-
d <- dplyr::do(d, !!!dots_as_quosures(dotz))
163-
add_data(.data, structure(d, set = set))
218+
summarise_.plotly <- function(.data, ...) {
219+
d <- summarise_(plotly_data(.data), ...)
220+
add_data(.data, d)
164221
}
165222

166223
#' @rdname plotly_data
167-
#' @export
168-
arrange_.plotly <- function(.data, ..., .dots) {
169-
d <- plotly_data(.data)
170-
additional_args <- dots_as_quosures(lazyeval::all_dots(.dots, ...))
171-
d <- dplyr::arrange(d, !!!additional_args)
224+
arrange_.plotly <- function(.data, ...) {
225+
d <- arrange_(plotly_data(.data), ...)
172226
add_data(.data, d)
173227
}
174228

175229
#' @rdname plotly_data
176-
#' @export
177-
select_.plotly <- function(.data, ..., .dots) {
178-
d <- plotly_data(.data)
179-
additional_args <- dots_as_quosures(lazyeval::all_dots(.dots, ...))
180-
d <- dplyr::select(d, !!!additional_args)
230+
select_.plotly <- function(.data, ...) {
231+
d <- select_(plotly_data(.data), ...)
181232
add_data(.data, d)
182233
}
183234

184235
#' @rdname plotly_data
185-
#' @export
186-
filter_.plotly <- function(.data, ..., .dots) {
187-
d <- plotly_data(.data)
188-
additional_args <- dots_as_quosures(lazyeval::all_dots(.dots, ...))
189-
d <- dplyr::filter(d, !!!additional_args)
236+
filter_.plotly <- function(.data, ...) {
237+
d <- filter_(plotly_data(.data), ...)
190238
add_data(.data, d)
191239
}
192240

193241
#' @rdname plotly_data
194-
#' @export
195-
distinct_.plotly <- function(.data, ..., .dots) {
196-
d <- plotly_data(.data)
197-
additional_args <- dots_as_quosures(lazyeval::all_dots(.dots, ...))
198-
d <- dplyr::distinct(d, .dots = !!!additional_args)
242+
distinct_.plotly <- function(.data, ...) {
243+
d <- distinct_(plotly_data(.data), ...)
199244
add_data(.data, d)
200245
}
201246

202247
#' @rdname plotly_data
203-
#' @export
204-
slice_.plotly <- function(.data, ..., .dots) {
205-
d <- plotly_data(.data)
206-
additional_args <- dots_as_quosures(lazyeval::all_dots(.dots, ...))
207-
d <- dplyr::slice(d, !!!additional_args)
248+
slice_.plotly <- function(.data, ...) {
249+
d <- slice_(plotly_data(.data), ...)
208250
add_data(.data, d)
209251
}
210252

211253
#' @rdname plotly_data
212-
#' @export
213-
rename_.plotly <- function(.data, ..., .dots) {
214-
d <- plotly_data(.data)
215-
additional_args <- dots_as_quosures(lazyeval::all_dots(.dots, ...))
216-
d <- dplyr::rename(d, !!!additional_args)
254+
rename_.plotly <- function(.data, ...) {
255+
d <- rename_(plotly_data(.data), ...)
217256
add_data(.data, d)
218257
}
219258

220259
#' @rdname plotly_data
221-
#' @export
222-
transmute_.plotly <- function(.data, ..., .dots) {
223-
d <- plotly_data(.data)
224-
additional_args <- dots_as_quosures(lazyeval::all_dots(.dots, ...))
225-
d <- dplyr::transmute(d, !!!additional_arg)
260+
transmute_.plotly <- function(.data, ...) {
261+
d <- transmute_(plotly_data(.data), ...)
226262
add_data(.data, d)
227263
}
228264

R/utils.R

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,15 +1166,6 @@ longest_element <- function(x) {
11661166
""
11671167
}
11681168

1169-
# Apply rlang::as_quosure across a list or vector, but explicitly pass env
1170-
# and expr to as_quosure
1171-
dots_as_quosures <- function(x) {
1172-
if (!inherits(x, "lazy_dots")) {
1173-
stop("Expected lazy dots")
1174-
}
1175-
lapply(x, function(x) rlang::new_quosure(x$expr, x$env))
1176-
}
1177-
11781169
# A dplyr::group_by wrapper for the add argument
11791170
group_by_add <- function(..., add = TRUE) {
11801171
if (packageVersion('dplyr') >= '1.0') {

man/api.Rd

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)