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行之间的区别。请注意,行#14的str_replace()
管道数据集是.x
,行#15的管道数据集只是.
。我习惯于以第15行的形式查看事物,并且似乎第14行的x
是良性的。
但是x
不是良性的。如果我将其包含在类似的mtcars代码中(如下),则会收到错误消息,而不是“ TRUE”。你能解释一下吗?我以前从未见过这种神秘的x
语法,这几乎并不意味着它并不重要(或不常见)。
identical(mtcars %>% .[1:2, ],
mtcars %>% .x[1:2, ])
# Error in `[.data.frame`(., .x, 1:2, ) : object '.x' not found
答案 0 :(得分:6)
.
是magrittr
管道(dplyr
导入)的基本传输单位。它包含来自管道的值。
.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"
您可以看到.
和.x
都是..1
的别名,{{1}}是传递给函数的第一个参数。