Как использовать трубопроводы magrittr с несколькими аргументами?
Для функций с одним аргументом довольно просто перевести "стандартный" код R в magrittr
стиль трубы.
mean(rnorm(100))
становится
rnorm(100) %>% mean
Для функций с несколькими аргументами мне не ясно, каков наилучший способ продолжить. Есть два случая.
Во-первых, случай, когда дополнительные аргументы являются константами. В этом случае вы можете создать анонимную функцию, которая изменяет постоянные значения. Например:
mean(rnorm(100), trim = 0.5)
становится
rnorm(100) %>% (function(x) mean(x, trim = 0.5))
Во-вторых, случай, когда требуется несколько векторных аргументов. В этом случае вы можете объединить входные данные в список и создать анонимную функцию, которая работает с элементами списка.
cor(rnorm(100), runif(100))
становится
list(x = rnorm(100), y = runif(100)) %>% (function(l) with(l, cor(x, y)))
В обоих случаях мои решения кажутся достаточно неуклюжими, и я чувствую, что мне не хватает лучшего способа сделать это. Как мне передать несколько аргументов в функции?
3 ответа
Используя пакет pipeR, решение для примера cor будет:
Piper:
set.seed(123)
rnorm(100) %>>% cor(runif(100))
[1] 0.05564807
margrittr:
set.seed(123)
rnorm(100) %>% cor(y = runif(100))
[1] 0.05564807
От автора пакета доступно отличное руководство pipeR. В этом случае нет большой разницы:-)
В версии 1.5 есть два варианта:
list(x = rnorm(100), y = runif(100)) %$% cor(x, y)
Что по сути так же, как
list(x = rnorm(100), y = runif(100)) %>% with(cor(x, y)) # you could also do this earlier
Или же
list(x = rnorm(100), y = runif(100)) %>% { cor(.$x, .$y) }
{
Пара создает лямбда (унарную функцию) на лету, поэтому вам не нужно делать все (function(x) { ... })
вещь.
Как примечание стороны, inset
а также inset2
псевдонимы могут использоваться для "подбора" значений в конвейере, например, в списках.
Первая проблема может быть решена %>%
Умная оценка. Неуклюжее решение упрощает
rnorm(100) %>% mean(trim = 0.5)
Вторая проблема может быть упрощена аналогичным образом, хотя неясно, является ли это "лучшим" решением.
rnorm(100) %>% cor(y = runif(100))