我仍在尝试理解R中的语句,但我不明白为什么下面函数中的替换失败。
my.toggle <- function(toggle) {
if (toggle) {
print("yes")
} else {
print("no")
}
}
fn.args <- list(toggle = T)
my.toggle(rlang::UQS(fn.args)) # fails
# Error in if (toggle) { : argument is not interpretable as logical
rlang::quo(my.toggle(rlang::UQS(fn.args))) # but this is the right function call
# <quosure: global>
# ~my.toggle(toggle = TRUE)
似乎调用my.toggle(rlang::UQS(fn.args))
应该等同于my.toggle(toggle = T)
(事实上,这是你在quo
中包装函数调用时得到的结果),但是功能无法正确执行。我做错了什么?
答案 0 :(得分:0)
你必须评估你的结果,如下:
library(rlang)
eval_tidy(quo(my.toggle(UQS(fn.args))))
[1] "yes"
[1] "yes"
(为什么它会打印两次?这是print()
的假象:print
通常会返回其参数,无形。它似乎是隐式调整可见性,所以返回值再次打印。如果您只是将print("yes")
替换为(print("yes"))
(使用parens手动切换可见性),则行为与my.toggle(toggle = TRUE)
再次一致。我不会太担心它。)
至于您收到错误的原因:UQS()
会返回一个列表,具体为:Dotted pair list of 1
:$ toggle: logi TRUE
。你可以使用my.toggle(UQS(fn.args)[["toggle"]])
进行攻击。