2014-10-27 90 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

相关问题