自定义函数:如何使用sym()和!!引用另一列(bang bang)没有在dplyr 0.8.0中使用funs()?

时间:2019-03-06 12:08:24

标签: r function dplyr nse

dplyr 0.8.0中,包装器funs()(在mutate_at()summarise_at()中使用)已被弃用。

新推荐的语法是使用~sum(.)而不是funs(sum(.)),这是我以前使用的“旧样式”。我的目标是将旧语法转换为新语法,但是当funs()中的函数调用使用(!!sym())来转换字符输入为列名<时,我一直遇到问题。 / strong>设置为可以在函数中识别的符号。

这是我如何以旧的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(),但是由于它已被软弃用,因此如果/完全被弃用,我想将代码迁移为稳定的格式。谢谢!

1 个答案:

答案 0 :(得分:1)

issues中提到的一种选择是使用.data

multiply_by2 <- function(var){
 iris %>% 
       mutate_at("Sepal.Length", list( ~ .* .data[[var]]))

}

multiply_by2("Sepal.Width")