Как использовать трубопроводы 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))
Другие вопросы по тегам