如何在函数内部使用 rlang::as_string() ?
how to use rlang::as_string() inside of a function?
我正在编写一个函数,其中我提供一个变量名作为符号。在函数的不同步骤中,我想将变量名称用作字符串。根据文档,rlang::as_string
“将符号转换为字符串。”
这是一个基本示例。此函数 returns 带有标题为 mean
.
的列的小标题
find_mean <- function(varname){
tibble(mean = mean(pull(mtcars, {{varname}})))
> find_mean(qsec)
# A tibble: 1 × 1
mean
<dbl>
1 17.8
我想添加另一列,变量名称为字符串,如下所示:
# A tibble: 1 × 2
mean variable
<dbl> <chr>
1 17.8 qsec
我认为这会起作用。
find_mean <- function(varname){
tibble(mean = mean(pull(mtcars, {{varname}})),
variable = rlang::as_string({{varname}}))
}
但是它returns这个错误。
> find_mean(qsec)
Error in ~qsec : object 'qsec' not found
我知道我在 rlang
的非标准评估规则方面犯了一些基本错误,但谷歌搜索并没有帮助我解决这个问题。
我们可以使用 ensym
转换为 sym
bol 然后应用 as_string
find_mean <- function(varname){
v1 <- rlang::as_string(rlang::ensym(varname))
tibble(mean = mean(pull(mtcars, {{varname}})),
variable = v1)
}
-测试
find_mean(qsec)
# A tibble: 1 x 2
mean variable
<dbl> <chr>
1 17.8 qsec
这也可以在 base R
中完成,即 deparse/substitute
> find_mean <- function(varname) deparse(substitute(varname))
> find_mean(qsec)
[1] "qsec"
这个也可以用。我们使用 enquo
来扩散用户定义的参数,并使用 !!
bang-bang 运算符来强制计算它。 ensym
和 enquo
之间的区别是第一个 returns 是原始表达式,而后者 returns 是一个 quosure,这是一个绑定到环境的表达式。因此,为了访问表达式并将其转换为字符串,我们需要使用 rlang::get_expr
并用 as_string
或 paste
:
包装它
library(rlang)
find_mean <- function(varname){
tibble(mean = mean(pull(mtcars, !!enquo(varname))),
variable = paste(get_expr(enquo(varname))))
}
# A tibble: 1 x 2
mean variable
<dbl> <chr>
1 17.8 qsec
我正在编写一个函数,其中我提供一个变量名作为符号。在函数的不同步骤中,我想将变量名称用作字符串。根据文档,rlang::as_string
“将符号转换为字符串。”
这是一个基本示例。此函数 returns 带有标题为 mean
.
find_mean <- function(varname){
tibble(mean = mean(pull(mtcars, {{varname}})))
> find_mean(qsec)
# A tibble: 1 × 1
mean
<dbl>
1 17.8
我想添加另一列,变量名称为字符串,如下所示:
# A tibble: 1 × 2
mean variable
<dbl> <chr>
1 17.8 qsec
我认为这会起作用。
find_mean <- function(varname){
tibble(mean = mean(pull(mtcars, {{varname}})),
variable = rlang::as_string({{varname}}))
}
但是它returns这个错误。
> find_mean(qsec)
Error in ~qsec : object 'qsec' not found
我知道我在 rlang
的非标准评估规则方面犯了一些基本错误,但谷歌搜索并没有帮助我解决这个问题。
我们可以使用 ensym
转换为 sym
bol 然后应用 as_string
find_mean <- function(varname){
v1 <- rlang::as_string(rlang::ensym(varname))
tibble(mean = mean(pull(mtcars, {{varname}})),
variable = v1)
}
-测试
find_mean(qsec)
# A tibble: 1 x 2
mean variable
<dbl> <chr>
1 17.8 qsec
这也可以在 base R
中完成,即 deparse/substitute
> find_mean <- function(varname) deparse(substitute(varname))
> find_mean(qsec)
[1] "qsec"
这个也可以用。我们使用 enquo
来扩散用户定义的参数,并使用 !!
bang-bang 运算符来强制计算它。 ensym
和 enquo
之间的区别是第一个 returns 是原始表达式,而后者 returns 是一个 quosure,这是一个绑定到环境的表达式。因此,为了访问表达式并将其转换为字符串,我们需要使用 rlang::get_expr
并用 as_string
或 paste
:
library(rlang)
find_mean <- function(varname){
tibble(mean = mean(pull(mtcars, !!enquo(varname))),
variable = paste(get_expr(enquo(varname))))
}
# A tibble: 1 x 2
mean variable
<dbl> <chr>
1 17.8 qsec