首页 > 解决方案 > 将列名传递给函数

问题描述

我对非标准评估有一个简单的问题:将变量名作为参数传递给函数。

作为一个可重现的例子,这里有一个简单的事情:mpgmtcars数据集中取一个变量的平均值。我的最终目标是拥有一个可以输入数据集和变量并获得平均值的函数。

所以没有函数:

library(tidyverse)
mtcars %>% summarise(mean = mean(mpg))

#>       mean
#> 1 20.09062

我尝试使用get()非标准评估,但出现错误:

library(tidyverse)
summary_stats <- function(variable, dataframe){
  dataframe %>% summarise(mean = get(variable))
}

summary_stats(mpg, mtcars)

#> Error: Problem with `summarise()` input `mean`.
#> x invalid first argument
#> ℹ Input `mean` is `get(variable)`.

reprex 包(v0.3.0)于 2020-09-19 创建

编辑:

我还有一个额外的后续问题。

我还需要将variable参数作为char字符串,我尝试了下面的代码,但我仍然想念如何做到这一点:

library(tidyverse)
summary_stats <- function(variable, dataframe){
  dataframe %>% summarise(mean = mean({{variable}}))
  print(as.character({{variable}}))
}

summary_stats(disp, mtcars)
#> Error in print(as.character({: object 'disp' not found

reprex 包(v0.3.0)于 2020-09-19 创建

标签: rdplyrtidyversenon-standard-evaluation

解决方案


您可以使用 curly-curly ( {{}}) 运算符将列名作为不带引号的变量传递。

要获取作为字符值传递的变量,我们可以使用deparse, substitute

library(dplyr)
library(rlang)

summary_stats <- function(variable, dataframe){
  print(deparse(substitute(variable)))
  dataframe %>% summarise(mean = mean({{variable}}))
}
#[1] "mpg"

#      mean
#1 20.09062

推荐阅读