【发布时间】: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 <- 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