gpt4 book ai didi

r - 何时使用 rlang::ensym() 而不是 rlang::sym()?

转载 作者:行者123 更新时间:2023-12-02 00:12:01 26 4
gpt4 key购买 nike

我从文档中可以看到rlang::enquo()rlang::quo()用于不同的上下文。因此,我使用了 rlang::enysm()最近在函数声明中(见下文)。然而,在另一个 SE 函数调用中,我收到了一个意外的错误,我猜它与惰性求值有关(如果我 force(x) in f_enysm() ,该错误就会消失)。但似乎我也可以通过简单地使用 sym(x) 来解决这个问题而不是ensym(x)x是一个不传达任何有关环境信息的字符串(与 quosures 相反)。

这样安全吗?

如果是的话,我不知道什么时候应该选择 ensym()超过sym并且提议的用途似乎与 quo() 使用的术语不一致/enquo() , expr()/enexpr()等等

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() ,我不明白这种有问题的行为。

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

最佳答案

ensym 可以采用带引号和不带引号的参数

f_ensym(mtcars, "cyl")
f_ensym(mtcars, cyl)
<小时/>

根据OP帖子中更新的示例,虽然sym采用字符串对象g仅采用三个参数,而fun > 它的一部分是 'f_ensymwhich 还有一个 fun` 没有被传入。我们还可以对此进行更多论证

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

关于r - 何时使用 rlang::ensym() 而不是 rlang::sym()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com