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

Joh*_* J. 2 r nse rlang

我正在编写一个函数,其中我提供一个变量名作为符号。在函数的另一个步骤中,我想将变量名用作字符串。根据文档,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
Run Code Online (Sandbox Code Playgroud)

我想将变量名作为字符串添加另一列,如下所示:

# A tibble: 1 × 2
   mean variable
  <dbl> <chr>   
1  17.8 qsec   
Run Code Online (Sandbox Code Playgroud)

我以为这会奏效。

find_mean <- function(varname){
  tibble(mean = mean(pull(mtcars, {{varname}})),
         variable = rlang::as_string({{varname}}))
}
Run Code Online (Sandbox Code Playgroud)

但它返回此错误。

> find_mean(qsec)
 Error in ~qsec : object 'qsec' not found 
Run Code Online (Sandbox Code Playgroud)

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

akr*_*run 5

我们可以使用ensym转换为symbol 然后应用as_string

find_mean <- function(varname){
  v1 <- rlang::as_string(rlang::ensym(varname))
  tibble(mean = mean(pull(mtcars, {{varname}})),
         variable = v1)
}
Run Code Online (Sandbox Code Playgroud)

-测试

find_mean(qsec)
# A tibble: 1 x 2
   mean variable
  <dbl> <chr>   
1  17.8 qsec    
Run Code Online (Sandbox Code Playgroud)

这也可以完成base R,即deparse/substitute

> find_mean <- function(varname) deparse(substitute(varname))
 
> find_mean(qsec)
[1] "qsec"
Run Code Online (Sandbox Code Playgroud)

  • `ensym` - 这就是我所缺少的!这也适用于我更复杂的实际用例。非常感谢@akrun。这不是你第一次让我免于巨大的挫败感。 (2认同)