【问题标题】:Tidy Eval: Using {{var}} inside a nesting function not possible?Tidy Eval:不可能在嵌套函数中使用 {{var}}?
【发布时间】:2020-10-23 04:19:43
【问题描述】:

我试图在我的函数中使用tidyr::complete,同时使用{{}} 提供变量名称。这很好用,但是,当我添加一个嵌套函数来组合两个变量时,我得到一个错误。请参阅下面的最小示例。

library(tidyverse)
library(rlang)

df <- tibble(
  group1 = c(1:2, 1),
  group2 = c("c", "c", "c"),
  item_id = c(1:2, 2),
  item_name = c("a", "b", "b"),
  value1 = 1:3,
  value2 = 4:6
)

my_complete <- function(data, var1, var2, var3, var4, var5, var6){
  data %>%
    tidyr::complete({{var1}}, {{var3}})
}

my_complete(df, var1 = group1, var2 = group2, var3 = item_id, var4 = item_name, var5 = value1, var6 = value2)

这可行,输出是:

# A tibble: 4 x 6
  group1 item_id group2 item_name value1 value2
   <dbl>   <dbl> <chr>  <chr>      <int>  <int>
1      1       1 c      a              1      4
2      1       2 c      b              3      6
3      2       1 NA     NA            NA     NA
4      2       2 c      b              2      5

但是,当我将两个变量与嵌套结合起来时,我得到了一个错误。


my_complete_nesting <- function(data, var1, var2, var3, var4, var5, var6){
  data %>%
    tidyr::complete(nesting({{var1}}, {{var2}}), nesting({{var3}}, {{var4}}))
}

my_complete_nesting(df, var1 = group1, var2 = group2, var3 = item_id, var4 = item_name, var5 = value1, var6 = value2)
 Error in .f(.x[[i]], ...) : object 'group1' not found 

也许我遗漏了一些东西,但我无法让它工作。我以为我了解如何使用{{}}。当我使用variable &lt;- enquo(variable)!!variable 的替代表达式时,我遇到了同样的问题。因此,导致问题的不是具体的{{}},而是我在这里使用 tidy eval 的方式。 我想得到以下输出:

df %>%
  tidyr::complete(nesting(group1, group2), nesting(item_id, item_name))

# A tibble: 4 x 6
  group1 group2 item_id item_name value1 value2
   <dbl> <chr>    <dbl> <chr>      <int>  <int>
1      1 c            1 a              1      4
2      1 c            2 b              3      6
3      2 c            1 a             NA     NA
4      2 c            2 b              2      5

非常感谢您对这个问题的帮助。也许我只是简单地遗漏了一些东西,但我似乎找不到问题。

谢谢!

【问题讨论】:

    标签: r metaprogramming tidyverse rlang tidyeval


    【解决方案1】:

    这实际上是一个您想要使用quosures的示例。 quosure 捕获一个表达式以及它应该被评估的上下文。在您的情况下,它捕获全局环境,其中 group1 未定义。这就是当nesting() 尝试解析表达式时,您会收到“找不到对象”错误的原因。

    因为您希望在数据帧的上下文中(而不是在全局上下文中)评估 group1,所以此处使用的正确机制是 ensym()

    my_complete_nesting <- function(data, var1, var2, var3, var4, var5, var6){
      data %>%
        tidyr::complete(nesting(!!ensym(var1), !!ensym(var2)), 
                        nesting(!!ensym(var3), !!ensym(var4)))
    
    }
    
    ## Now works
    my_complete_nesting(df, var1 = group1, var2 = group2, 
                        var3 = item_id, var4 = item_name, 
                        var5 = value1, var6 = value2)
    

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2011-06-08
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多