82
82
# ' values_from = c(estimate, moe)
83
83
# ' )
84
84
# '
85
- # ' # Can perform aggregation with values_fn
85
+ # ' # Can perform aggregation with ` values_fn`
86
86
# ' warpbreaks <- as_tibble(warpbreaks[c("wool", "tension", "breaks")])
87
87
# ' warpbreaks
88
88
# ' warpbreaks %>%
91
91
# ' values_from = breaks,
92
92
# ' values_fn = mean
93
93
# ' )
94
+ # '
95
+ # ' # Can pass an anonymous function to `values_fn` when you
96
+ # ' # need to supply additional arguments
97
+ # ' warpbreaks$breaks[1] <- NA
98
+ # ' warpbreaks %>%
99
+ # ' pivot_wider(
100
+ # ' names_from = wool,
101
+ # ' values_from = breaks,
102
+ # ' values_fn = ~mean(.x, na.rm = TRUE)
103
+ # ' )
94
104
pivot_wider <- function (data ,
95
105
id_cols = NULL ,
96
106
names_from = name ,
@@ -193,12 +203,13 @@ pivot_wider_spec <- function(data,
193
203
values_fn = NULL ) {
194
204
spec <- check_spec(spec )
195
205
196
- if (is.function (values_fn )) {
197
- values_fn <- rep_named(unique( spec $ .value ), list (values_fn ) )
206
+ if (is.null (values_fn )) {
207
+ values_fn <- list ()
198
208
}
199
- if (! is.null( values_fn ) && ! is.list (values_fn )) {
200
- abort( " ` values_fn` must be a NULL, a function, or a named list" )
209
+ if (! vec_is_list (values_fn )) {
210
+ values_fn <- rep_named(unique( spec $ .value ), list ( values_fn ) )
201
211
}
212
+ values_fn <- map(values_fn , as_function )
202
213
203
214
if (is_scalar(values_fill )) {
204
215
values_fill <- rep_named(unique(spec $ .value ), list (values_fill ))
@@ -248,7 +259,7 @@ pivot_wider_spec <- function(data,
248
259
key = val_id ,
249
260
val = val ,
250
261
value = value ,
251
- summarize = values_fn [[value ]]
262
+ values_fn = values_fn [[value ]]
252
263
)
253
264
val_id <- dedup $ key
254
265
val <- dedup $ val
@@ -329,9 +340,8 @@ name <- value <- NULL
329
340
# Helpers -----------------------------------------------------------------
330
341
331
342
# Not a great name as it now also casts
332
- vals_dedup <- function (key , val , value , summarize = NULL ) {
333
-
334
- if (is.null(summarize )) {
343
+ vals_dedup <- function (key , val , value , values_fn = NULL ) {
344
+ if (is.null(values_fn )) {
335
345
if (! vec_duplicate_any(key )) {
336
346
return (list (key = key , val = val ))
337
347
}
@@ -345,11 +355,10 @@ vals_dedup <- function(key, val, value, summarize = NULL) {
345
355
}
346
356
347
357
out <- vec_split(val , key )
348
- if (! is.null(summarize ) && ! identical(summarize , list )) {
349
- summarize <- as_function(summarize )
358
+ if (! is.null(values_fn ) && ! identical(values_fn , list )) {
350
359
# This is only correct if `values_fn` always returns a single value
351
360
# Needs https://github.com/r-lib/vctrs/issues/183
352
- out $ val <- vec_c(!!! map(out $ val , summarize ))
361
+ out $ val <- vec_c(!!! map(out $ val , values_fn ))
353
362
}
354
363
355
364
out
0 commit comments