【问题标题】:When are enquo() and as_label() required?什么时候需要 enquo() 和 as_label()?
【发布时间】:2020-10-15 13:27:03
【问题描述】:

Tidy Evaluation 中的示例表明,为了在赋值的 LHS 上使用变量,我们必须使用 as_label() 和 enquo()。

然而,我发现以下似乎工作正常:

addSma = function( data, period ) {  
  colName = paste0("smaCl_", period)

  ts2 = data %>%
    dplyr::mutate( !!colName := SMA(close, n=period ) )

  return( ts2 )
}

我不太明白 as_label() 和 enquo() 是做什么的,什么时候真正需要它们。

【问题讨论】:

    标签: r tidyeval


    【解决方案1】:

    除了支持取消引用(现在支持粘合字符串)之外,:= 的 LHS 的工作方式与 = 相同:它需要符号或字符串。

    没有要求使用enquo(),您可以取消引用:= LHS 上的任何字符串。

    当你在函数参数上使用enquo() 时,结果可以是任何类型的 R 对象。它通常是符号或调用,但也可以是数字或字符串,如1"foo"。如果用户调用!! 它真的可以是任何东西。在这种情况下,如果您需要一个字符串来表示您捕获的这个参数并且可以是任何值,您可以使用as_label()。它对任何 R 对象都有很好的定义,并保证返回一个表示该对象的字符串。

    【讨论】:

    • 非常感谢。这似乎是有道理的,但显然我仍然误解了这里的一个关键方面。如果我现在执行“dplyr::mutate(gspcOhlc,昨天 = dplyr::lag(!!nm, n=1))”,我只会得到一列 NA。我用 nm="open"、as_label() 和 enquo() 都试过了,结果都一样(没有错误消息提示出了什么问题)。
    • 那是因为如果nm 包含一个字符串(比如"foo"),那么您实际上是在使用lag("foo", n = 1) 而不是lag(foo, n = 1)。这将返回NA,然后将其回收到数据框大小。尝试使用!!sym(nm) 而不是!!nm。但请注意as_label() _not_meant 用作列名,请参阅?as_label
    猜你喜欢
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2011-07-05
    • 2018-12-10
    • 2010-12-29
    • 2017-07-13
    • 2012-08-21
    • 2011-08-18
    相关资源
    最近更新 更多