2012-11-17 35 views
2

我有一個問題,它是another question的擴展。R使用匿名函數進行流水線操作

我希望能夠管道匿名函數。在前面的問題的答案,管道定義的功能是建立一個管道運營商「%|>%」,並確定它是這樣的:

"%|>%" <- function(fun1, fun2){ 
       function(x){fun2(fun1(x))} 
} 

這將允許你打電話了一系列的功能,同時不斷地傳遞前一個功能的結果到下一個。需要注意的是要預定義的功能。現在我試圖找出如何用匿名函數來做到這一點。它使用預定義功能以前的解決方案是這樣的:

square <- function(x){x^2} 
add5 <- function(x){x + 5} 

pipelineTest <- 
    square %|>% 
    add5 

,讓你這個behviour:

> pipelineTest(1:10) 
[1] 6 9 14 21 30 41 54 69 86 105 

我希望能夠與這樣的匿名函數定義pipelineTest功能:

anonymousPipelineTest <- 
    function(x){x^2} %|>% 
    function(x){x+5} %|>% 
    x 

當我嘗試如上我得到以下使用相同的參數來調用這個:

> anonymousPipelineTest(1:10) 
function(x){fun2(fun1(x))} 
<environment: 0x000000000ba1c468> 

我希望得到的結果與pipelineTest(1:10)的結果相同。我知道這是一個微不足道的例子。我真正想要的是一種管理匿名函數的方法。謝謝您的幫助!

+0

最後一個問題是一個有趣的練習,但實際上這不是'R方式'來做事情。在上一個問題中,您是否有理由不想按照[Seth建議](http://stackoverflow.com/a/13354145/1003565)的方式進行操作? – Dason

回答

4

使用撰寫,並調用結果函數給出了這樣:

"%|>%" <- function(...) Compose(...)() 

現在擺脫「x的'作爲最終的「功能」(替換爲實際功能,這不是必需的,但在此例如):

anonymousPipelineTest <- 
    function(x){x^2} %|>% 
    function(x){x+5} %|>% function(x){x} 
anonymousPipelineTest(1:10) 

[1] 6 9 14 21 30 41 54 69 86 105 
+0

真棒!謝謝!奇蹟般有效。 –

0

這是?funprog幫助頁面上提供了一個示例應用程序:

Funcall <- function(f, ...) f(...) 
anonymousPipelineTest <- function(x) Reduce(Funcall, list(
    function(x){x+5}, function(x){x^2}), 
    x, right=TRUE) 
anonymousPipelineTest(1:10) 
#[1] 6 9 14 21 30 41 54 69 86 105 
+0

當然,但您可以輕鬆使用'Compose'嗎? 'anonyPipeTest < - 撰寫(函數(x){x^2},函數(x){x + 5})'我個人不明白爲什麼他們不只是做更自然的'R方式',而是我仍然對原始問題的答案感興趣 - 您如何讓二元運算符在具有匿名函數的情況下工作? – Dason

+0

我(現在)看到Wallhood忽略了@ mnel的答案,這本質上是我獨立構建的。 –

+0

該結果與OP不同。這個答案是以與OP相反的順序應用函數(他平方,然後加5)。 –

0

我正在提出一個答案,這是我找到的其他人尋找相同的事情時最接近的答案。我不會給自己點回答,因爲這不是我想要的。

返回一個函數: 如果你想要把幾個功能結合在一起,我發現最簡單的就是用在「功能」包中的「撰寫」功能R.這將是這個樣子:

anonymousPipe <- Compose(
    function(x){x^2}, 
    function(x){x+5}) 

這可以讓你把這個系列的功能是這樣的:

> anonymousPipe(1:10) 
[1] 6 9 14 21 30 41 54 69 86 105 

返回數據: 如果您只想從一些數據開始並通過一系列轉換(我的原意)發送它,那麼'Compose'函數中的第一個函數應該是您的起始數據,並且在'Compose'函數關閉後添加一個括號對來調用該函數。它看起來像這樣:

anonymousPipeData <- Compose(
    seq(1:10), 
    function(x){x^2}, 
    function(x){x+5})() 

anonymousPipeData」現在這是一系列功能的結果的數據。請注意最後一對括號。這是導致R返回數據而不是函數的原因。