【问题标题】:How do I use the variables from rlang::UQS in a custom function?如何在自定义函数中使用 rlang::UQS 中的变量?
【发布时间】:2017-10-18 14:59:57
【问题描述】:

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

【问题讨论】:

    标签: r rlang


    【解决方案1】:

    你必须像这样评估你的 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() 返回一个列表,具体来说:Dotted pair list of 1:$ toggle: logi TRUE。您可以使用my.toggle(UQS(fn.args)[["toggle"]]) 来破解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2017-11-27
      • 1970-01-01
      • 2021-12-21
      • 2022-11-14
      相关资源
      最近更新 更多