Данные трубопроводов dplyr - разница между `.` и` .x` - PullRequest
1 голос
/ 10 июня 2019
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 доброкачественно.

Но x не доброкачественный. Если я включу его в аналогичный код mtcars (ниже), я получу ошибку вместо «ИСТИНА». Вы можете это объяснить? Я никогда раньше не видел этот загадочный синтаксис x, что вряд ли означает, что он не важен (или распространен).

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

1 Ответ

6 голосов
/ 10 июня 2019

. - это базовая единица передачи для magrittr трубопроводов (которые dplyr импортирует).Он содержит значение, полученное из трубы.

Значение .x - это то, что добавил мир тививерс.Он используется, тогда у вас есть анонимные функции, созданные с синтаксисом ~ (тильда).Это вызывает 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, который является первым параметром, переданным функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...