gpt4 book ai didi

r - 为什么 .env 代词在 dplyr::slice_max 中不起作用?

转载 作者:行者123 更新时间:2023-12-03 21:45:07 30 4
gpt4 key购买 nike

.env代词用于指代环境中的对象(而不是在 data.frame 中)在其他 dplyr 动词中效果很好,但在 slice_max 中返回错误.为什么?
考虑以下函数:


library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(rlang)

f1 <- function(y) {
d <- tibble(x = runif(20))
d %>%
slice_max(order_by = .data$x, n = .env$y)
}

f2 <- function(y) {
d <- tibble(x = runif(20))
d %>%
filter(.data$x >= .env$y)
}

f3 <- function(y) {
d <- tibble(x = runif(20))
d %>%
mutate(z = .env$y)
}

f1(2)
#> Error: `n` must be a single number.
f2(0.8)
#> # A tibble: 8 x 1
#> x
#> <dbl>
#> 1 0.936
#> 2 0.812
#> 3 0.998
#> 4 0.962
#> 5 0.901
#> 6 0.875
#> 7 1.00
#> 8 0.919
f3(2)
#> # A tibble: 20 x 2
#> x z
#> <dbl> <dbl>
#> 1 0.0318 2
#> 2 0.928 2
#> 3 0.983 2
#> 4 0.622 2
#> 5 0.583 2
#> 6 0.0314 2
#> 7 0.481 2
#> 8 0.791 2
#> 9 0.476 2
#> 10 0.599 2
#> 11 0.468 2
#> 12 0.234 2
#> 13 0.276 2
#> 14 0.382 2
#> 15 0.914 2
#> 16 0.736 2
#> 17 0.572 2
#> 18 0.863 2
#> 19 0.337 2
#> 20 0.515 2
reprex package 创建于 2020 年 11 月 16 日(v0.3.0)

最佳答案

函数 dplyr:::check_slice_size 抛出错误。由 slice_max.data.frame 调用.该函数的第 7:9 行是:

        if (!is.numeric(n) || length(n) != 1) {
abort("`n` must be a single number.")
}
所以 n必须是长度为一的数字。 .env代词在这里没有实现。
那么这是一个错误吗?我会争辩说不是。你不需要 .env在这里,因为 n参数不使用整洁的评估,也不应该。因为它只对 n 有意义作为单个数字,使用整洁评估的唯一情况是在单行小标题中。但是如果你知道你有一个单行的小标题,那么调用 slice_max 是没有意义的。 .这是一个 22 条规则:您唯一能够使用 tidy 评估的时候是没有用处的时候。因此,这是一个很好的设计决策。
您可以放心,没有歧义。如果您使用 y在这里,它总是被解释为你想要的 .env$y :
library(dplyr)
library(rlang)

f1 <- function(y) {
d <- tibble(x = runif(20), y = rnorm(20))
d %>%
slice_max(order_by = .data$x, n = y)
}

f1(2)
#> # A tibble: 2 x 2
#> x y
#> <dbl> <dbl>
#> 1 0.971 -1.65
#> 2 0.918 0.151
reprex package 创建于 2020 年 11 月 16 日(v0.3.0)

关于r - 为什么 .env 代词在 dplyr::slice_max 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64862814/

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