【发布时间】:2019-03-06 12:08:24
【问题描述】:
在dplyr 0.8.0 中,包装器funs()(在mutate_at() 或summarise_at() 中使用)被软性弃用。
推荐的新语法是使用~sum(.) 而不是funs(sum(.)),这是我之前使用的“旧样式”。我的目标是将旧语法转换为新语法,但是当funs() 中的函数调用使用 (!!sym()) 将字符输入 列名 转换为可以在函数中识别的符号。
这是一个虚构的示例,说明我将如何以旧的dplyr 样式编写函数。
var 是一个字符串,表示列名,在funs() 处乘以Sepal.Length。
multiply_by <- function(var){
iris %>%
mutate_at("Sepal.Length",funs(.*!!sym(var)))
}
multiply_by("Sepal.Width") # This works
我的问题是我无法弄清楚如何将其转换为新的 ~ 语法而不会遇到错误。如果我运行以下命令,则会触发“无效参数类型”错误:
multiply_by2 <- function(var){
iris %>%
mutate_at("Sepal.Length",~.*!!sym(var))
}
multiply_by2("Sepal.Width")
# Error in !sym(var) : invalid argument type
有人可以帮忙吗?目前我可以使用funs(),但由于它已被软弃用,我想在/当它完全被硬弃用时将我的代码迁移到稳定的格式。谢谢!
【问题讨论】:
-
试试
mutate_at("Sepal.Length", list(~.*!!sym(var))) -
谢谢 - 但这似乎触发了同样的错误 - “!sym(var) 中的错误:无效的参数类型”
-
尝试
iris %>% mutate_at("Sepal.Length", list( ~ .* .data[[var]])),如issues中所述 -
谢谢 - 就像一个魅力!它不是一个“dplyr”解决方案,而是解决了我的问题。
-
同意。当您需要使用 3-4 个额外的函数来包装函数调用时,它会破坏可读性和使用管道!