我遇到过这个概念几次,但不知道它的名称,因此无法通过谷歌了解更多信息。基本上,当查看其他人编写的函数或甚至简单的命令时,我经常会看到类似于这样的东西:
apply(dataset, 1:2, function(x) 10 * x)
在这种情况下,我能够推断出这个“假函数”function(x)以某种方式将数据集的每个元素乘以10。这似乎是一个有用的功能,但我仍然不确定何时或如何使用它。它真的是一个函数吗?还是只能在apply函数族中使用?这个东西有名字吗?
我遇到过这个概念几次,但不知道它的名称,因此无法通过谷歌了解更多信息。基本上,当查看其他人编写的函数或甚至简单的命令时,我经常会看到类似于这样的东西:
apply(dataset, 1:2, function(x) 10 * x)
在这种情况下,我能够推断出这个“假函数”function(x)以某种方式将数据集的每个元素乘以10。这似乎是一个有用的功能,但我仍然不确定何时或如何使用它。它真的是一个函数吗?还是只能在apply函数族中使用?这个东西有名字吗?
*apply()
函数中使用,但它们不必如此,例如:(function(x,y){x*y + x/y})(2,5)
# [1] 10.4
从R 4.1.0版本开始,现在可以本地使用\(x) {}
代替function(x) {}
来表示匿名函数。
应用代码可以编写为
dataset |>
apply(1:2, \(x) {10 * x})
~/.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中使用了,所以我使用了双大括号)。我刚想到这个,如果有错误请告诉我。
->
操作符。 (参考链接:https://gist.github.com/klmr/25dc765211c59bb749b0) - Konrad Rudolph%>%
转换成 base::\
<-``? - Robert Krzyzanowski{
之前和之后,我的计算机上 system.time(replicate(1e6, {1+1}))
的运行时间从3.7秒变为37.1秒。 - Josh O'Brien<-
一起重载 (
,以创建与 Coffeescript 中完全相同的 lambda。 - Robert Krzyzanowski