magrittr `.` 代词和 rlang `.data` 代词是相同的,但这怎么可能呢?
The magrittr `.` pronoun and rlang `.data` pronoun are identical, but how can that be?
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
看看那个。它们完全相同。除了他们可能不是。来自上面链接的文章:
The . pronoun from magrittr is not appropriate here because it
represents the whole data frame, whereas .data represents the subset
for the current group.
有什么区别?你可能在想,"Just read that sentence above that you pasted"。不幸的是,如果你能提供的话,我需要更多的解释。一些例子会很好。我首先想到的尝试(上面的代码)将两个代词显示为 "identical"。我在这里感觉到矛盾。谢谢。
希望这能说明您问题中的引述:
``` 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 忍者。
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
看看那个。它们完全相同。除了他们可能不是。来自上面链接的文章:
The . pronoun from magrittr is not appropriate here because it represents the whole data frame, whereas .data represents the subset for the current group.
有什么区别?你可能在想,"Just read that sentence above that you pasted"。不幸的是,如果你能提供的话,我需要更多的解释。一些例子会很好。我首先想到的尝试(上面的代码)将两个代词显示为 "identical"。我在这里感觉到矛盾。谢谢。
希望这能说明您问题中的引述:
``` 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 忍者。