【问题标题】:what is the alternative to prefixing .data with rlang用 rlang 为 .data 加上前缀的替代方法是什么
【发布时间】:2021-12-23 17:17:58
【问题描述】:
m <- 10
mtcars %>% dplyr::mutate(disp = rlang::.data$disp * .env$m)

上述方法不起作用。

目标是能够删除我的包中的importFrom rlang .data

如果前缀方法不起作用,还有什么替代方法可以实现?

【问题讨论】:

  • 为什么不能使用disp,即mtcars %&gt;% dplyr::mutate(disp = disp * .env$m)。根据示例,disp 不需要任何.data$。即使在分组数据中
  • 据我所知 (cran.r-project.org/web/packages/dplyr/vignettes/…),.datadplyr 的东西......它只是一个代词,所以不是导出为 dplyr::.data 的东西。也许mutate(disp = cur_data()$disp * .env$m)
  • @akrun 是的,你说得对,对于这个特定的例子,它是不需要的
  • @r2evans 该示例有效。但它会普遍工作吗?也就是说,哪里有.data,我可以用cur_data()替换它?
  • @free_lions_n_tigers_from_cages 不,这取决于上下文。 cur_data() 仅在某些情况下有效

标签: r tidyverse rlang .data


【解决方案1】:

正如我在其他answer 中提到的,dplyr::cur_data_all() 应该是替代.data 的替代方案。我还没有看到cur_data_all() 不起作用在数据屏蔽 dplyr 动词中,但 .data 起作用的情况。我们还可以访问分组变量,这不适用于cur_data()

library(dplyr)

mtcars %>%
  group_by(cyl) %>%
  transmute(x = cur_data()[["cyl"]],
            y = .data[["cyl"]],
            z = cur_data_all()[["cyl"]]) 
#> # A tibble: 32 x 3
#> # Groups:   cyl [3]
#>      cyl     y     z
#>    <dbl> <dbl> <dbl>
#>  1     6     6     6
#>  2     6     6     6
#>  3     4     4     4
#>  4     6     6     6
#>  5     8     8     8
#>  6     6     6     6
#>  7     8     8     8
#>  8     4     4     4
#>  9     4     4     4
#> 10     6     6     6
#> # … with 22 more rows

但是,在 dplyr 之外的动词 cur_data_all() 不能使用,而 .data 将根据上下文起作用。例如tibbles 就是这种情况:

library(dplyr)

tibble(new = 1,
       new2 = .data$new)
#> # A tibble: 1 x 2
#>     new  new2
#>   <dbl> <dbl>
#> 1     1     1

tibble(new = 1,
       new2 = cur_data_all()$new)
#> Error in context_peek("mask", fun): `cur_data_all()` must only be used inside dplyr verbs.

虽然cur_data()cur_data_all() 抛出一个错误,说它们只能在dplyr 动词中使用,但这只是对了一半。它们只能在 data-masking dplyr 动词中使用。但是,这对于 .data 也适用,它不适用于支持整齐选择的动词:

library(dplyr)

mtcars %>% 
  select(6)
#>                        wt
#> Mazda RX4           2.620
#> Mazda RX4 Wag       2.875
#> Datsun 710          2.320
#> Hornet 4 Drive      3.215
#> Hornet Sportabout   3.440
#> Valiant             3.460
...

mtcars %>% 
  select(first(.data$cly)) # should be 6 the same as above
#> Error in stop_fake_data_subset(): Can't subset `.data` outside of a data mask context.

mtcars %>% 
  select(first(cur_data_all()$cly)) # should be 6 the same as above
#> Error in context_peek("mask", fun): `cur_data_all()` must only be used inside dplyr verbs.

reprex package (v0.3.0) 于 2021 年 12 月 23 日创建

【讨论】:

  • 这需要在包中工作。
  • 我的理解(可能是错误的)是该软件包正在使用 dplyr 并且目标只是摆脱对 rlang 的直接依赖。在这种情况下,用cur_data_all() 替换.data 应该可以工作。当然,对 rlang 仍然存在间接依赖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多