我最近遇到了一些奇怪的 dplyr
行为,其中 summarize
会不停地引用上一个组中的对象。
这里有一个简单的可重现示例来说明这种令人惊讶的行为:
library(dplyr, warn.conflicts = FALSE)
tibble(x = rep(letters[1:3], times = 4),
y = rnorm(12)) %>%
group_by(x) %>%
summarize(z1 = sum(y),
z2 = {
attr(y, "test") <- "test"
sum(y)
})
#> # A tibble: 3 × 3
#> x z1 z2
#> <chr> <dbl> <dbl>
#> 1 a 0.602 0.602
#> 2 b 1.22 0.602
#> 3 c -0.310 0.602
由reprex package(v2.0.1)于2022-10-31创建
我期望z1
和z2
是相同的。 我不明白为什么给向量y
设置属性意味着在后面的迭代中,“正确”的元素引用被隐藏了。
这个问题可以通过在最后一行使用sum(.data $ y)
轻松解决,但我想了解summarize
非标准评估中的作用域规则。 如果有帮助文档或解释指向tidyverse非标准评估框架中当前行为有意义的任何指针,都将不胜感激。
我正在使用R 4.1.1和dplyr 1.0.7。
dplyr
用于评估summarize
内容的任何环境中创建了y
的新副本。我希望更好地理解这些环境如何协作,以避免将来出现微妙的错误。 - const-aethis_y <<- y
给出的y
是相同的,无论在调整属性之前还是之后分配了y
。 - Captain Hatmagrittr::set_attr()
的行为与预期相同。 - Captain Haty
是分组变量有关 - 将y
分配给其他内容并更改其属性会产生预期的结果。 - Captain Hat