自定义函数:如何使用 sym() 和 !! 引用另一列(砰砰)在 dplyr 0.8.0 中不使用 funs()?
Custom functions: How to refer to another column using sym() and !! (bang bang) without using funs() in dplyr 0.8.0?
在 dplyr 0.8.0
中,包装器 funs()
(在 mutate_at()
或 summarise_at()
中使用)已软弃用。
新的推荐语法是使用 ~sum(.)
而不是 funs(sum(.))
,这是我以前使用的 "old style"。我的目标是将旧语法转换为新语法,但是当 funs()
中的函数调用使用 (!!sym()
) 将字符输入 转换为列时,我遇到了问题name 为函数内可识别的符号。
这是我如何用旧 dplyr
风格编写函数的虚构示例。
var
是引用列名的字符串,在funs()
处乘以Sepal.Length
。
multiply_by <- function(var){
iris %>%
mutate_at("Sepal.Length",funs(.*!!sym(var)))
}
multiply_by("Sepal.Width") # This works
我的问题是我不知道如何在不遇到错误的情况下将其转换为新的 ~
语法。如果我 运行 以下它会触发 'invalid argument type' 错误:
multiply_by2 <- function(var){
iris %>%
mutate_at("Sepal.Length",~.*!!sym(var))
}
multiply_by2("Sepal.Width")
# Error in !sym(var) : invalid argument type
有人可以帮忙吗?目前我可以使用 funs()
,但由于它被软弃用,我想将我的代码迁移到稳定格式 if/when,它变得完全硬弃用。谢谢!
issues 中提到的一个选项是使用 .data
multiply_by2 <- function(var){
iris %>%
mutate_at("Sepal.Length", list( ~ .* .data[[var]]))
}
multiply_by2("Sepal.Width")
在 dplyr 0.8.0
中,包装器 funs()
(在 mutate_at()
或 summarise_at()
中使用)已软弃用。
新的推荐语法是使用 ~sum(.)
而不是 funs(sum(.))
,这是我以前使用的 "old style"。我的目标是将旧语法转换为新语法,但是当 funs()
中的函数调用使用 (!!sym()
) 将字符输入 转换为列时,我遇到了问题name 为函数内可识别的符号。
这是我如何用旧 dplyr
风格编写函数的虚构示例。
var
是引用列名的字符串,在funs()
处乘以Sepal.Length
。
multiply_by <- function(var){
iris %>%
mutate_at("Sepal.Length",funs(.*!!sym(var)))
}
multiply_by("Sepal.Width") # This works
我的问题是我不知道如何在不遇到错误的情况下将其转换为新的 ~
语法。如果我 运行 以下它会触发 'invalid argument type' 错误:
multiply_by2 <- function(var){
iris %>%
mutate_at("Sepal.Length",~.*!!sym(var))
}
multiply_by2("Sepal.Width")
# Error in !sym(var) : invalid argument type
有人可以帮忙吗?目前我可以使用 funs()
,但由于它被软弃用,我想将我的代码迁移到稳定格式 if/when,它变得完全硬弃用。谢谢!
issues 中提到的一个选项是使用 .data
multiply_by2 <- function(var){
iris %>%
mutate_at("Sepal.Length", list( ~ .* .data[[var]]))
}
multiply_by2("Sepal.Width")