将列名传递给函数

问题描述

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

作为一个可重现的示例,这很简单:从mpg数据集中取一个变量mtcars的平均值。我的最终目标是拥有一个可以输入数据集和变量并获取均值的函数

因此没有功能

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 package(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 package(v0.3.0)于2020-09-19创建

解决方法

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

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

library(dplyr)
library(rlang)

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

#      mean
#1 20.09062

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...