如何在自定义函数中使用rlang :: UQS中的变量?

时间:2017-10-18 14:59:58

标签: r rlang

我仍在尝试理解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中包装函数调用时得到的结果),但是功能无法正确执行。我做错了什么?

1 个答案:

答案 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"]])进行攻击。