magrittr`.`代词和rlang`.data`代词是相同的,但是怎么回事呢?

时间:2019-07-03 18:02:18

标签: r rlang magrittr tidyeval

Finally! TidyEval is getting easier,这使我在magrittr .代词和rlang代词.data之间进行了代词测试。

library(tidyverse)
identical(head(iris, 2) %>% mutate(col = .$Species),
          head(iris, 2) %>% mutate(col = .data$Species))
#> [1] TRUE

看看。它们完全相同。除非他们可能不是。来自上面链接的文章:

  

。 magrittr的代词在这里不合适,因为   代表整个数据帧,而.data代表子集   用于当前组。

有什么区别?您可能在想,“只需在粘贴的上方阅读该句子”即可。不幸的是,如果您能提供的话,我需要更多的解释。某些示例将是不错的。我想到尝试的第一件事(上面的代码)将两个代词显示为“相同”。我在这里感觉到矛盾。谢谢。

1 个答案:

答案 0 :(得分:1)

希望这将说明您的问题中的报价:

``` r
library(dplyr)
iris[48:52,] %>% 
  group_by(Species) %>% 
  transmute(
    Sepal.Length,
    col0 = mean(Sepal.Length),
    col1 = mean(.$Sepal.Length),
    col2 = mean(.data$Sepal.Length))
#> # A tibble: 5 x 5
#> # Groups:   Species [2]
#>   Species    Sepal.Length  col0  col1  col2
#>   <fct>             <dbl> <dbl> <dbl> <dbl>
#> 1 setosa              4.6  4.97  5.66  4.97
#> 2 setosa              5.3  4.97  5.66  4.97
#> 3 setosa              5    4.97  5.66  4.97
#> 4 versicolor          7    6.7   5.66  6.7 
#> 5 versicolor          6.4  6.7   5.66  6.7
```

我认为有些人喜欢用它来传递参数而没有!!sym(foo)体操:

col <- "Species"
iris[48:52,] %>% 
  mutate(
    SPECIES1 = toupper(!!sym(col)),
    SPECIES2 = toupper(.data[[col]]))
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species   SPECIES1
#> 1          4.6         3.2          1.4         0.2     setosa     SETOSA
#> 2          5.3         3.7          1.5         0.2     setosa     SETOSA
#> 3          5.0         3.3          1.4         0.2     setosa     SETOSA
#> 4          7.0         3.2          4.7         1.4 versicolor VERSICOLOR
#> 5          6.4         3.2          4.5         1.5 versicolor VERSICOLOR
#>     SPECIES2
#> 1     SETOSA
#> 2     SETOSA
#> 3     SETOSA
#> 4 VERSICOLOR
#> 5 VERSICOLOR

对于什么值,我必须总共使用.data 3次,而当我这样做时,可能会有更好的方法了。我认为其中一两个与ggplot2一起使用。

您几乎可以忽略.data的存在,但仍然可以成为非常体面的tidyverse忍者。