首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用“!”而不附加“`rlang`”

使用“!”而不附加“`rlang`”
EN

Stack Overflow用户
提问于 2022-03-24 17:01:37
回答 1查看 124关注 0票数 2

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

因此,我的问题是,为什么下面的代码不直接使用::访问::

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

我的理解是,为了访问!!函数,我必须用::指定包,但是这个示例可以工作,所以我缺少什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-24 17:04:18

它之所以有效,是因为‘rlang’/tidy计算实际上并没有解析!!操作符,它甚至没有定义这样的操作符--实际上,这个操作符根本不存在!这只是两个链式的!操作符,它们从未得到评估,因为整齐的计算使用了非标准评价。“rlang”中的实际实现是在C++中实现的,修复R的操作符优先规则中的不匹配是相当复杂的,但是功能子集的简化版本可能如下所示:

代码语言:javascript
复制
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”检查未计算的表达式是否包含!运算符的两个立即嵌套的调用。

因此,即使您愿意,也不能导入或附加一个!!操作符。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71606535

复制
相关文章

相似问题

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