如何在函数内部使用 rlang::as_string()?

我正在编写一个函数,其中我提供一个变量名作为符号。在函数的另一个步骤中,我想将变量名用作字符串。根据文档,rlang::as_string“将符号转换为字符串。”

这是一个基本示例。此函数返回一个标题为 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}}))
}

但它返回这个错误。

> find_mean(qsec)
 Error in ~qsec : object 'qsec' not found 

我知道我在 rlang 的非标准评估规则方面犯了一些基本错误,但在谷歌上搜索还没有帮助我弄清楚这一点。

pmzq1234qzmp 回答:如何在函数内部使用 rlang::as_string()?

我们可以使用 ensym 转换为 symbol 然后应用 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 运算符对其进行强制评估。 ensymenquo 之间的区别在于第一个返回原始表达式,而后者返回一个 quosure,它是一个绑定到环境的表达式。因此,为了访问表达式并将其转换为字符串,我们需要使用 rlang::get_expr 并将其用 as_stringpaste 包装:

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  
本文链接:https://www.f2er.com/591.html

大家都在问