dplyr 管道数据 - `.` 和 `.x` 之间的差异

2024-03-17

df1 <- data.frame(
  " " = c(" ", "Part Number 1", "Part Number 2", "Part Number 3"), 
  Julie = c("Measurement 1", 33, 34, 33),
  Julie = c("Measurement 2", 32, 31, 31),
  Joe = c("Measurement 1", 33, 33, 30),
  Joe = c("Measurement 2", 31, 32, 31))

df1 %>%
  mutate_all(as.character) %>% 
  set_names(c("Part", paste(names(.)[2:ncol(.)], .[1, 2:ncol(.)], sep = "-"))) %>%
  `[`(2:nrow(.), ) %>%
  gather("key", "value", contains("Measurement")) %>%
  separate("key", c("person", "measurement"), sep = "-") %>%
  mutate_at("person", ~ stringr::str_replace(.x, "\\..*",""))   # line 14
  # mutate_at("person", ~ stringr::str_replace(., "\\..*",""))  # line 15

在上面的代码中我只想强调一件事,那就是第 #14 行和第 #15 行之间的区别。请注意,str_replace()第 14 行的管道数据集是.x第 15 行的管道数据集只是.。我习惯以第 15 行的形式看待事物,看起来x第 14 行是良性的。

But the x不是良性的。如果我将它包含在类似的 mtcars 代码(如下)中,我会收到错误而不是“TRUE”。你能解释一下吗?我从未见过如此神秘的x之前的语法,这并不意味着它不重要(或常见)。

identical(mtcars %>% .[1:2, ],
          mtcars %>% .x[1:2, ])
# Error in `[.data.frame`(., .x, 1:2, ) : object '.x' not found

The .是传输的基本单位magrittr管道(其中dplyr进口)。它包含来自管道的值。

The .x价值是 tidyverse 世界添加的东西。使用它然后你就可以使用创建的匿名函数~(波形符)语法。这调用rlang::as_function将该公式转换为函数。这基本上是一个捷径,所以不必输入function(x) x+5,你可以写~.x+5。由于函数可以有多个参数,因此使用该参数的名称会很有帮助,这样.x指第一个参数(并且.y第二)。这as_function还允许您使用.作为第一个参数的别名。它能做到这一点是因为~创建一个公式并magrittr一般不会取代.在公式中,以便映射器可以自由地重新解释.。您可以在此处查看函数签名

f <- rlang::as_function(~.x+5)
f
# <lambda>
# function (..., .x = ..1, .y = ..2, . = ..1) 
# .x + 5
# attr(,"class")
# [1] "rlang_lambda_function"

您可以看到两者如何. and .x是别名..1这是传递给函数的第一个参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dplyr 管道数据 - `.` 和 `.x` 之间的差异 的相关文章

随机推荐