【问题标题】:tidy evaluation question on quoting code using vars()关于使用 vars() 引用代码的整洁评估问题
【发布时间】:2019-10-20 09:10:19
【问题描述】:

我正在阅读这份整洁的评估文档https://tidyeval.tidyverse.org/sec-why-how.html,但无法理解为什么这里的第一段代码不起作用而第二段代码起作用:

starwars %>% summarise_at(ends_with("color"), n_distinct)

starwars %>% summarise_at(vars(ends_with("color")), n_distinct)

第一段代码显示错误消息:'No tidyselect variables were registered'

然后我推测,由于某种原因,它无法在星球大战数据框中找到以颜色结尾的列。

什么是 vars() 使它在 Starwars 数据框中找到列?它与它所寻找的环境有关吗?

【问题讨论】:

    标签: r dplyr tidyeval


    【解决方案1】:

    vars() 正在阻止立即评估其参数。如果您在控制台中调用它,您会看到它返回用于计算值(即表达式)的蓝图,而不是值本身:

    > dplyr::vars(ends_with("color"))
    <list_of<quosure>>
    
    [[1]]
    <quosure>
    expr: ^ends_with("color")
    env:  global
    

    这些延迟的计算稍后会在变量可用的情况下恢复。如果您立即运行它们,则上下文尚未设置,您会收到一个 tidyselect 错误。

    【讨论】:

    • 根据?select_helpers 它只适用于选择功能,为什么要保留它呢?它在所有 tidyverse 函数中工作的成本是多少?
    • across() 将在 dplyr 1.0.0 中用于桥接数据屏蔽和选择。
    【解决方案2】:

    需要vars(...),以便正确填写ends_with 的vars 参数。如果您自己填写,则不需要vars

    starwars %>% summarise_at(ends_with("color", vars = names(.)), n_distinct)
    

    给予:

    # A tibble: 1 x 3
      hair_color skin_color eye_color
           <int>      <int>     <int>
    1         13         31        15
    

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 2021-01-08
      • 1970-01-01
      • 2012-10-25
      • 2018-06-10
      • 2020-04-28
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多