在 rlang 中声明一个没有反引号的 sym

Declaring a sym without backticks in rlang

我正在定义这样一个函数;

afun <- function(formula,data,level){
    dataname <- rlang::sym(deparse(substitute(data)))
    
    call('somefunction',formula = formula,data = dataname,vec = c(2,3,4),level = level)
}

当我使用这些变量时,它return就是这样;

+ afun(Sepal.Width ~ Petal.Length,iris,4)

- somefunction(formula = Sepal.Width ~ Petal.Length, data = iris, 
    vec = c(2, 3, 4), level = 4)

但是当我像这样在 data 参数中使用额外的表达式时;

+ afun(Sepal.Width ~ Petal.Length,na.omit(iris),4)

- somefunction(formula = Sepal.Width ~ Petal.Length, data = `na.omit(iris)`, 
    vec = c(2, 3, 4), level = 4)

它 return 带有反引号。

我应该如何实现 return na.omit(iris) 而不是 `na.omit(iris)` 的功能?

提前致谢。

您打算将 na.omit(iris) 解释为 调用,而不是单个 符号。使用 substitute 时您已经捕获了调用,但由于某种原因,您使用 deparse 将其转换为字符串,然后将 that 转换为单个 符号 使用 rlang::sym。出现反引号是因为您已告诉 rlang 将字符串转换为单个符号,而不是将其保留为调用。

为什么不单独使用 substitute?它很简单,不需要额外的包。

afun <- function(formula, data, level) {
    
    call('somefunction', 
         formula = formula, 
         data    = substitute(data), 
         vec     = c(2, 3, 4),
         level   = level)
} 

afun(Sepal.Width ~ Petal.Length, na.omit(iris), 4)
#> somefunction(formula = Sepal.Width ~ Petal.Length, data = na.omit(iris), 
#>     vec = c(2, 3, 4), level = 4)

想用rlang

可以用enexpr
afun <- function(formula,data,level){
    dataname <- rlang::enexpr(data)
    
    call('somefunction',formula = formula,data = dataname,vec = c(2,3,4),level = level)
    
    
    
}

-测试

afun(Sepal.Width ~ Petal.Length,na.omit(iris),4)
somefunction(formula = Sepal.Width ~ Petal.Length, data = na.omit(iris), 
    vec = c(2, 3, 4), level = 4)