首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用rlang::ensym()超过rlang::sym()?

何时使用rlang::ensym()超过rlang::sym()?
EN

Stack Overflow用户
提问于 2018-03-10 11:24:13
回答 1查看 1.9K关注 0票数 9

从文档中可以看出,rlang::enquo()rlang::quo()在不同的上下文中使用。因此,我最近在函数声明中使用了rlang::enysm() (见下文)。但是,在另一个SE函数调用中,我得到了一个意外的错误,我想这与延迟计算有关(如果我在force(x)中使用f_enysm(),这个错误就会消失)。但是,我似乎也可以通过使用sym(x)而不是ensym(x)来解决这个问题,因为x是一个字符串,它不传递任何有关环境的信息(与商相反)。

这安全吗?

如果是的话,我看不出什么时候我应该更喜欢ensym()而不是sym,而且建议的用法似乎与quo() / enquo()expr() / enexpr()等的术语不一致。

代码语言:javascript
复制
library(rlang)
f_ensym <- function(data, x, fun) {
  x <- fun(x)
  head(dplyr::arrange(data, !!x))
}
f_ensym(mtcars, "cyl", sym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1


f_sym <- function(data, x) {
  x <- sym(x)
  head(dplyr::arrange(data, !!x))
}

g <- function(data, x, fun) {
  fun(data, x)
}

g(mtcars, "cyl", f_ensym)
#> Error in fun(x): argument "fun" is missing, with no default
g(mtcars, "cyl", f_sym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1

# If I remove one level, I don't get the problematic behaviour.
f <- function(data, x, fun) {
  x <- fun(x)
  head(dplyr::arrange(data, !!x))
}
f(mtcars, "cyl", sym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1
f(mtcars, "cyl", ensym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1

另外,如果我删除中间函数f_sym()f_enysm()并直接调用f(),我就不会得到问题行为。

代码语言:javascript
复制
f <- function(data, x, fun) {
  x <- fun(x)
  head(dplyr::arrange(data, !!x))
}
f(mtcars, "cyl", sym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1
f(mtcars, "cyl", ensym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-10 11:31:53

ensym可以同时使用引用的和未引用的参数

代码语言:javascript
复制
f_ensym(mtcars, "cyl")
f_ensym(mtcars, cyl)

根据OP文章中更新的示例,而sym接受字符串对象g只接受三个参数,而其中的fun部分是没有传递到的'f_ensymwhich also have afun`‘。

代码语言:javascript
复制
g <- function(data, x, fun, fun2) {
     fun(data, x, fun2)
  }

g(mtcars, "cyl", f_ensym, sym)
#   mpg cyl  disp hp drat    wt  qsec vs am gear carb
#1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49208497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档