R中的函数(x):写一个"函数"没有定义功能?

时间:2014-10-27 20:46:26

标签: r function

我曾经多次遇到过这个概念,但不知道它的名字,所以不能谷歌去了解更多。基本上,当查看其他人编写的函数或简单命令时,我会经常看到类似的东西:

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

在这种情况下,我能够弄清楚这个"假功能" function(x)只会将数据集的每个元素乘以10.这似乎是一个有用的功能,但我仍然不确定您何时或如何使用它。它真的是一个功能吗?或者它是否只适用于函数系列?这个东西有名字吗?

3 个答案:

答案 0 :(得分:9)

这些被称为"匿名函数",是的,它们是真正的函数对象,恰好在被使用之前没有被分配给任何符号。

这里是R language documentation的相关位:

  

通常将函数分配给符号,但它们不需要。调用函数返回的值是一个函数。如果没有给出名称,则将其称为匿名函数。匿名函数最常用作其他函数的参数,例如apply family或outer。

虽然它们最常用于*apply()函数,但它们不必如此处所示,例如

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

答案 1 :(得分: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 :(得分:0)

R 4.1.0 开始,现在可以在本地使用 \(x) {} 而不是 function(x) {} 来实现匿名函数。

apply 代码可以写成

dataset |>
    apply(1:2, \(x) {10 * x})