如何解决重命名后如何使用整洁的 eval 引用函数内的变量?
是否可以在使用 tidy 评估重命名后引用变量名称?例如,我想编写一个与以下代码执行相同操作但允许在函数参数中指定新变量名称的函数:
library(tidyverse)
mtcars %>%
rename(cylinder = cyl) %>%
group_by(cylinder) %>%
summarize(mean_mpg = mean(mpg))
但是,我被困在 group_by
行(在下面的代码中),因为 !!varname
和 {{ varname }}
都不能替代问号。我假设 !!varname
不起作用,因为它扩展为字符串;并且 {{ varname }}
不起作用,因为调用该函数时不存在具有新名称的列。我也没有看到使用 glue
语法的方法,因为该行中没有分配任何内容。
my_rename <- function(df,varname) {
df %>%
rename("{varname}" := cyl) %>%
group_by(???) %>%
summarize(mean_mpg = mean(mpg))
}
解决方法
使用 {{varname}} 运行两者似乎可行
my_rename <- function(df,varname) {
df %>%
rename({{varname}} := cyl) %>%
group_by({{varname}}) %>%
summarize(mean_mpg = mean(mpg))
}
my_rename(mtcars,cylinder)
# A tibble: 3 x 2
cylinder mean_mpg
<dbl> <dbl>
1 4 26.7
2 6 19.7
3 8 15.1
,
为了让您的函数工作,您首先必须解除自定义参数名称。为此,我们可以使用 ensym
或 enquo
函数来解除用户定义的参数。之后,您应该使用 bang bang (!!)
运算符取消引用它。
my_rename <- function(df,varname) {
varname <- ensym(varname)
df %>%
rename(!!varname := cyl) %>%
group_by(!!varname) %>%
summarize(mean_mpg = mean(mpg))
}
my_rename(mtcars,cylinder)
# A tibble: 3 x 2
cylinder mean_mpg
<dbl> <dbl>
1 4 26.7
2 6 19.7
3 8 15.1
这是我们使用 enquo
函数代替 ensym
的另一种方式:
my_rename <- function(df,varname) {
varname <- enquo(varname)
df %>%
rename(!!varname := cyl) %>%
group_by(!!varname) %>%
summarize(mean_mpg = mean(mpg))
}
# A tibble: 3 x 2
cylinder mean_mpg
<dbl> <dbl>
1 4 26.7
2 6 19.7
3 8 15.1
,
关于粘合语法,您需要 "{{ varname }}" :=
而不是 "{varname}"
。简单的 curl 是普通的胶水语法,它获取一个字符串inside 一个变量。双卷曲是扩展的胶水语法,它查看跨 函数参数以查看用户键入的内容。所以正确的语法是:
my_rename <- function(df,varname) {
df %>%
rename("{{ varname }}" := cyl) %>%
group_by({{ varname }}) %>%
summarize(mean_mpg = mean(mpg))
}
my_rename(mtcars,cylinder)
#> # A tibble: 3 x 2
#> cylinder mean_mpg
#> <dbl> <dbl>
#> 1 4 26.7
#> 2 6 19.7
#> 3 8 15.1
现在让我们用您的原始代码解压缩行为:
my_rename <- function(df,varname) {
df %>%
rename("{varname}" := cyl)
}
my_rename(mtcars,cylinder)
#> Error: object 'cylinder' not found
这里的问题是 "{varname"}
本质上是这样做的:
cylinder
#> Error: object 'cylinder' not found
取而代之的是:
rlang::quo(cylinder)
#> <quosure>
#> expr: ^cylinder
#> env: global
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。