【问题标题】:Why doesn't .env pronoun work inside dplyr::slice_max?为什么 .env 代词在 dplyr::slice_max 中不起作用?
【发布时间】:2021-02-27 22:25:59
【问题描述】:

.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 (v0.3.0) 于 2020 年 11 月 16 日创建

【问题讨论】:

  • 好点,@AllanCameron

标签: r dplyr rlang


【解决方案1】:

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

        if (!is.numeric(n) || length(n) != 1) {
            abort("`n` must be a single number.")
        }

所以n 必须是长度为一的数字。 .env 代词在这里没有实现。

所以这是一个错误吗?我会争辩说不是。这里不需要.env,因为n 参数不使用tidy 评估,也不应该使用。因为只有n 是一个数字才有意义,所以使用整洁评估的唯一情况是在单行小标题中。但是如果你知道你有一个单行小标题,那么调用slice_max 是没有意义的。这是一个 22 条规则:唯一一次你可以使用整洁的评估是没有用的时候。因此,这是一个很好的设计决策。

您可以放心,没有歧义。如果你在这里使用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 (v0.3.0) 于 2020 年 11 月 16 日创建

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2022-01-20
    • 2016-06-16
    相关资源
    最近更新 更多