2014-09-21 2365 views
7

對於單參數函數,將「標準」R代碼翻譯爲magrittr管道樣式是相當簡單的。如何使用具有多參數函數的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))) 

在這兩種情況下,我的解決方案似乎不多,所以我覺得我缺少一個更好的方式來做到這一點笨重。我應該如何將多個參數傳遞給函數?

回答

6

使用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教程available來自包的授權者。沒有太多:-)

2

第一個問題可以通過%>%的巧妙評估來解決。笨重的解決方案簡化爲:

rnorm(100) %>% mean(trim = 0.5) 

第二個問題可以通過類似的方式簡化,但不清楚這是否是「最佳」解決方案。

rnorm(100) %>% cor(y = runif(100)) 
+1

我傾向於在這種情況下使用'pipeR'。這部分是每個用戶更習慣的習慣用語,所以我建議大家一起玩這兩個包,看看哪些可以幫助他們更多。 – 2014-09-21 13:16:16

+1

@CarlWitthoft有趣。那麼'pipeR'解決方案的外觀如何? – 2014-09-21 13:24:57

+1

那麼,我並不擅長管道工具,但我喜歡'pipeR'的是你可以使用「。」。在右側的多個位置表示左側的輸出。 – 2014-09-21 16:47:29

7

以V 1.5在這種情況下的差異有兩種選擇:

list(x = rnorm(100), y = runif(100)) %$% cor(x, y) 

這是essemtially一樣

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) } 

{對在運行中創建一個lambda(一元函數),因此您不必完成整個(function(x) { ... })的事。作爲一個附註,insetinset2別名可以被用來「拾取」流水線中的值,例如,名單。

+0

哦,我的天啊,你不知道我一直希望在R中有多少匿名函數的語法... – 2017-04-21 03:35:11

相關問題