r - 将列名传递给函数
问题描述
我对非标准评估有一个简单的问题:将变量名作为参数传递给函数。
作为一个可重现的例子,这里有一个简单的事情: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 包(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 创建
解决方案
您可以使用 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
推荐阅读
- java - Spring AbstractAuthenticationFailureEvent 不起作用。身份验证失败时
- robotframework - 有没有其他方法可以用第一个答案来解决这个问题?
- python - 覆盖多选 BooleanField 请求响应 django
- openstack - 如何在 openstack trove 中创建 percona 实例或 Percona XtraDB Cluster?
- oracle - CREATE ANY TABLE 不足以创建任何表?
- c# - itext 7页面删除C#的奇怪问题
- storybook - 故事书 argType 和 defaultValue 在侧边栏中更改视图时选择丢失值
- oracle-sqldeveloper - Oracle Apex 中的自定义访问角色
- c++ - 字符串错误和保存数据(带链表)
- python-3.x - Django 更改第 3 方模型名称