2014-10-27 60 views
5

我幾次遇到這個概念,但不知道它的名字,所以不能谷歌它瞭解更多。基本上,通過功能看,甚至其他人編寫簡單的命令,我經常會看到類似這樣的東西的時候:R中的函數(x):寫一個「函數」而不定義一個函數?

apply(dataset, 1:2, function(x) 10 * x) 

在這種情況下,我能弄清楚,不知怎的,這個「假功能」 功能(X )只會將數據集的每個元素乘以10.這似乎是一個有用的功能,但我仍不確定何時或如何使用它。它真的是一個功能嗎?或者它只是在適用的功能家族中起作用?這個東西有沒有名字?

+4

它被稱爲匿名函數。這應該有助於谷歌搜索。 – joran 2014-10-27 20:50:34

回答

8

這些被稱爲「匿名函數」,是的,他們是真正的函數對象,它們在使用前恰好沒有被分配到任何符號。

下面是來自R language documentation的相關位:

一般功能分配到符號,但他們並不需要的人。調用函數返回的值是一個函數。如果沒有給出名稱,則稱其爲匿名函數。匿名函數最常用作其他函數的參數,如應用系列或外部函數。

雖然他們在*apply()功能最常用,他們不需要,因爲在這裏可以看到,例如

(function(x,y){x*y + x/y})(2,5) 
# [1] 10.4 
6

你的意思是一個lambda(匿名函數)?你可以把這樣的事情在你的~/.Rprofile文件:

`{` <- function(...) 
    base::`{`(
    if (length(sys.calls()) >= 4 && 
     identical(as.character(sys.call()[[1]]), "{") && 
     identical(as.character(sys.call(-4)[[1]]), "{")) 
     base::`{`(fn <- new('function'), 
     formals(fn) <- alist(x=), body(fn) <- sys.call(), fn) 
    else eval.parent(substitute(base::`{`(...))) 
) 

然後,你可以做這樣的事情:

sapply(1:10, {{x + 5}}) 
# [1] 6 7 8 9 10 11 12 13 14 15 

這是接近像Ruby或者CoffeeScript的語言不需要調用一個關鍵字做一個lambda(在那裏他們使用->但這已經在R,所以我用雙括號)。我只是想出了這個,所以如果有錯誤讓我知道。

+2

這可能對OP沒有任何幫助,但這是一個有趣的想法。我自己,[我偏偏超載' - >'。](https://gist.github.com/klmr/25dc765211c59bb749b0) – 2014-10-27 21:05:27

+0

我的問題是,我工作的大多數人實際上使用' - >'當在控制檯中隨機調用時進行分配 - 比回到開始更容易 – 2014-10-27 21:09:32

+0

我想你可以將'%>%'變成'base :: \'< - \''? – 2014-10-27 21:11:00