Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的函数(x):写一个;功能“;没有定义函数?_R_Function - Fatal编程技术网

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

R中的函数(x):写一个;功能“;没有定义函数?,r,function,R,Function,我曾多次遇到过这个概念,但不知道它的名称,因此无法通过谷歌了解更多信息。基本上,当浏览其他人编写的函数或甚至简单命令时,我经常会看到类似的内容: apply(dataset, 1:2, function(x) 10 * x) 在本例中,我能够计算出这个“假函数”函数(x)将数据集的每个元素乘以10。这似乎是一个有用的功能,但我仍然不确定何时或如何使用它。它真的是一个函数吗?或者它只是在apply函数族中工作?这东西有名字吗 这些被称为“匿名函数”,是的,它们是真正的函数对象,只是在使用之前没有

我曾多次遇到过这个概念,但不知道它的名称,因此无法通过谷歌了解更多信息。基本上,当浏览其他人编写的函数或甚至简单命令时,我经常会看到类似的内容:

apply(dataset, 1:2, function(x) 10 * x)
在本例中,我能够计算出这个“假函数”函数(x)将数据集的每个元素乘以10。这似乎是一个有用的功能,但我仍然不确定何时或如何使用它。它真的是一个函数吗?或者它只是在apply函数族中工作?这东西有名字吗

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

以下是来自的相关位:

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

尽管它们通常用于
*apply()
函数中,但它们不需要,例如,从这里可以看到

(function(x,y){x*y + x/y})(2,5)
# [1] 10.4
你是说(匿名函数)?您可以在
~/.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::`{`(...)))
  )

这更接近于Ruby或Coffeescript这样的语言,它们不需要调用关键字来生成lambda(在这里,它们使用
->
,但这已经在R中使用了,所以我使用了双大括号)。我刚刚想到了这个,所以如果有bug,请告诉我。

R4.1.0开始,现在可以在本机使用
\(x){}
而不是
函数(x){}
来实现匿名函数

apply代码可以写成

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

这叫做匿名函数。这对谷歌搜索应该有帮助。这可能对OP毫无帮助,但这是一个有趣的想法。我自己,我的问题是,大多数与我共事的人实际上在控制台中随机咀嚼时使用
->
来分配任务,这比回到开头容易这是一个有趣的想法,尽管我建议在重新定义这样一个基本的R符号时要小心。例如,
system.time(replicate(1e6,{1+1}))
在我的盒子上从3.7秒变为37.1秒,在你重新定义
{
@KonradRudolph之前和之后,实际上你可以超载
一起是的,有一天我希望理解这里所说的四分之一以上:)听起来很有趣。。。
dataset |>
    apply(1:2, \(x) {10 * x})