我正在尝试在函数内使用pivot_wider。这些值不是唯一定义的,因此我需要指定pivot_wider的values_fn参数,它应该返回一个列表。 value_fn 的列是函数的参数。
这是一个最小的例子:
library(rlang)
library(tidyverse)
t <- tibble::tibble(a = c(rep("A", 2), rep("B", 3), "C"),
b = seq(1:6))
# This works without a function
t %>% tidyr::pivot_wider(names_from = a,
values_from = b,
values_fn = list(b = list))
# Now I want to do the same with a function. But the := is not valid in the values_fn.
pivot_func <- function(dat, name_col, value_col){
dat %>%
tidyr::pivot_wider(names_from = {{name_col}},
values_from = {{value_col}},
values_fn = list({{value_col}} := list))
}
pivot_func(t, a, b)
错误:“:=”只能在准引号参数中使用运行“rlang::last_error()”以查看发生错误的位置。
最佳答案
该错误告诉您您正在非准引号参数内使用 :=
。这是因为您在函数 list
中使用它。此外,您正在使用 {{values_from}}
,但您的函数没有名为 values_from
的参数。
相反,您可以在管道之前创建所需的函数列表并将其传递给 values_fn
:
pivot_func <- function(dat, name_col, value_col){
fns <- setNames(list(list), deparse(substitute(value_col)))
dat %>%
tidyr::pivot_wider(names_from = {{name_col}},
values_from = {{value_col}},
values_fn = fns)
}
pivot_func(t, a, b)
#> # A tibble: 1 x 3
#> A B C
#> <list> <list> <list>
#> 1 <int [2]> <int [3]> <int [1]>
或者,如果您想坚持 rlang 语法,您可以执行以下操作:
pivot_func <- function(dat, name_col, value_col){
dat %>%
tidyr::pivot_wider(names_from = {{name_col}},
values_from = {{value_col}},
values_fn = setNames(list(list),
expr_deparse(enexpr(value_col))))
}
它做同样的事情。
关于r - 在带有函数参数中的命名变量的函数中使用pivot_wider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71423206/