我正在编写一个包,我的函数之一生成了一个ggplot。我只想导入ggplot2或rlang (不依赖于它们)。经过一些尝试和错误,我设法使它工作,但现在我不知道它为什么工作。
因此,我的问题是,为什么下面的代码不直接使用::访问::?
arg1 <- "Species"
ggplot2::ggplot(iris, ggplot2::aes(x = Petal.Width, y = !!rlang::sym(arg1))) +
ggplot2::geom_bar(stat = "summary", fun = "max")我的理解是,为了访问!!函数,我必须用::指定包,但是这个示例可以工作,所以我缺少什么?
发布于 2022-03-24 17:04:18
它之所以有效,是因为‘rlang’/tidy计算实际上并没有解析!!操作符,它甚至没有定义这样的操作符--实际上,这个操作符根本不存在!这只是两个链式的!操作符,它们从未得到评估,因为整齐的计算使用了非标准评价。“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”检查未计算的表达式是否包含!运算符的两个立即嵌套的调用。
因此,即使您愿意,也不能导入或附加一个!!操作符。
https://stackoverflow.com/questions/71606535
复制相似问题