0

我仍在尝试理解 R 中的 quosures,但我不明白为什么下面函数中的替换会失败。

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),但是该函数无法正确执行。我究竟做错了什么?

4

1 回答 1

0

您必须评估您的 quosure,如下所示:

library(rlang)

eval_tidy(quo(my.toggle(UQS(fn.args))))

[1] "yes"
[1] "yes"

(为什么它打印两次?这是一个人工制品print():print通常返回其参数,不可见。似乎评估隐式切换可见性,因此返回值再次打印。如果您只是替换print("yes")(print("yes"))(用括号手动切换可见性),行为是再次与my.toggle(toggle = TRUE))​​ 一致。我不会太担心它)。

至于为什么你得到错误:UQS()返回一个列表,特别是: a Dotted pair list of 1: $ toggle: logi TRUE。你可以用 my.toggle(UQS(fn.args)[["toggle"]]).

于 2017-10-26T12:10:14.693 回答