gpt4 book ai didi

r - 整洁的Eval : Using {{var}} inside a nesting function not possible?

转载 作者:行者123 更新时间:2023-12-03 16:20:54 25 4
gpt4 key购买 nike

我试图在函数中使用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的替代表达式时,我遇到了相同的问题。因此,不是造成问题的具体原因是 {{}},而是我在此处使用整洁的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
对于这个问题,我将不胜感激。也许我只是简单地缺少一些东西,但是我似乎找不到问题。
谢谢!

最佳答案

这实际上是一个示例,您不想想要使用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)

关于r - 整洁的Eval : Using {{var}} inside a nesting function not possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62698505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com