gpt4 book ai didi

r - 使用 `!!` 而不附加 `rlang`

转载 作者:行者123 更新时间:2023-12-05 08:35:52 24 4
gpt4 key购买 nike

我正在写一个包,我的一个函数生成了一个 ggplot。我只想导入 ggplot2 或 rlang(不依赖于它们)。经过一些尝试和错误后,我设法让它工作,但现在我不确定为什么它能工作。

所以我的问题是,为什么下面的代码可以在不使用 :: 直接访问 !! 的情况下工作?

arg1 <- "Species"
ggplot2::ggplot(iris, ggplot2::aes(x = Petal.Width, y = !!rlang::sym(arg1))) +
ggplot2::geom_bar(stat = "summary", fun = "max")

我的理解是,为了访问 !! 函数,我应该用 :: 指定包,但是这个例子有效,所以我错过了什么?

最佳答案

之所以有效,是因为“rlang”/tidy 求值实际上并没有解析 !! 运算符,它甚至没有定义这样的运算符——事实上运算符甚至不存在! 它只是两个链式 ! 运算符,它们永远不会被评估,因为 tidy 评估使用 non-standard evaluation . “rlang”中的实际实现是用 C++ 实现的,修复 R 运算符优先级规则中的不匹配相当复杂,但功能子集的简化版本可能如下所示:

bang = as.name('!')

interpolate_bang_bang = function (expr, envir) {
if (is.call(expr) && expr[[1L]] == bang) {
if (is.call(expr[[2L]]) && expr[[2L]][[1L]] == bang) {
eval(expr[[2L]][[2L]], envir = envir)
} else {
expr
}
} else {
expr
}
}

这将测试未计算的表达式是否恰好是 !! ‹something›,并将其替换为 ‹something› 的评估版本。真正的实现要复杂得多,因为它需要处理任意复杂的嵌套表达式(例如 1 + !!x),而且它还做了很多其他事情。但上面说明了基本事实:没有 !! 运算符。相反,“rlang”检查未评估的表达式是否包含两个立即嵌套的 ! 运算符调用。

因此,即使您愿意,也无法导入或附加 !! 运算符。

关于r - 使用 `!!` 而不附加 `rlang`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71606535/

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