我曾经多次遇到过这个概念,但不知道它的名字,所以不能谷歌去了解更多。基本上,当查看其他人编写的函数或简单命令时,我会经常看到类似的东西:
apply(dataset, 1:2, function(x) 10 * x)
在这种情况下,我能够弄清楚这个"假功能" function(x)只会将数据集的每个元素乘以10.这似乎是一个有用的功能,但我仍然不确定您何时或如何使用它。它真的是一个功能吗?或者它是否只适用于函数系列?这个东西有名字吗?
答案 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})