问题描述
作为一个可重现的示例,这很简单:从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({{}}
)运算符将列名作为未加引号的变量传递。
要获取作为字符值传递的变量,我们可以使用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