【问题标题】:Creating a list of quosures using purrr使用 purrr 创建一个 quosures 列表
【发布时间】:2018-08-06 12:11:10
【问题描述】:

是否可以使用 purrr 返回 quosures 列表?

foo <- c(1:3)
purrr::map(foo, rlang::quo(. + 2))

返回评估的quosures(即包含3到5的列表)。

有没有办法返回包含 quo(1 + 2)、quo (2 + 2) 等的列表?

(如果重要或将来访问的包版本:purrr 0.2.5,rlang 0.2.1)。

【问题讨论】:

  • 也许purrr::map(foo, ~substitute(rlang::quo(. + 2))) ?
  • 这似乎返回:> purrr::map(foo, ~substitute(rlang::quo(. + 2))) [[1]] rlang::quo(..1 + 2 ) [[2]] rlang::quo(..1 + 2) [[3]] rlang::quo(..1 + 2)
  • 参见adv-r.hadley.nz/quasiquotation.html中的“Map-reduce 生成代码”部分
  • Fab - 谢谢。我认为这是 Advanced R 的新篇章?第 1 版是我的 R 圣经,但我倾向于在其死树版中使用它。
  • 刚刚通过那一章进行了侦察 - 非常好。正是我需要的(对于这个和其他几个问题 - 我的项目中正在进行太多的 tidyeval !!!)

标签: r purrr tidyeval


【解决方案1】:

您可以使用 !! 将输入取消引用到 quosure:

foo <- c(1:3)
purrr::map(foo, ~ rlang::quo(!!.x + 2))
#> [[1]]
#> <quosure>
#>   expr: ^1L + 2
#>   env:  0000000015213C98
#> 
#> [[2]]
#> <quosure>
#>   expr: ^2L + 2
#>   env:  0000000015217758
#> 
#> [[3]]
#> <quosure>
#>   expr: ^3L + 2
#>   env:  00000000157B9FD0

请注意,这里我们还使用 map() 中匿名函数的公式简写来返回未评估的 quosure。 Quosures 本身可以被map() 强制转换为函数(使用purrr::as_mapper()),所以你首先得到评估答案的原因是因为你实际上是在写map(foo, ~ . + 2)

reprex package (v0.2.0.9000) 于 2018 年 8 月 6 日创建。

【讨论】:

  • 你明白了:-) +1
猜你喜欢
  • 2018-03-13
  • 2020-09-07
  • 2019-12-26
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
相关资源
最近更新 更多