R中的lambda函数?

时间:2011-10-20 08:37:37

标签: r lambda

我需要使用/学习R在uni的新讲座,我目前正在努力学习它的语法。我想绘制(通过curve)一个简单的函数,但我似乎无法使用内联lambda函数。

我尝试了以下内容:

> curve( function(x) x^2 )
Error in curve(function(x) x^2) : 
  'expr' did not evaluate to an object of length 'n'

然而,当我首先将函数存储在变量中时,它可以工作:

> quad <- function(x) x^2
> curve( quad )

R中不允许这样的内联使用吗?有没有其他方法可以在不定义额外功能的情况下完成这项工作?谢谢!

3 个答案:

答案 0 :(得分:44)

只是为了完整。您可以在R中使用“lambda-like”(匿名)函数,但如果要将它们立即使用,则需要将函数定义括在括号或大括号中:

(function (x) x+1) (1)
{function (x,y) x^y} (2,3)

curve的情况下,第一个参数是表达式或函数名称 - 但如果它是函数名,则首先将其转换为表达式。 (请参阅curve的源代码中的前几行)。所以如果它'不是函数名,你需要一个表达式 - 它可能包含一个“lambda”函数:

curve((function (x) x^2)(x))

如果你想使用一个函数(而不是它的名字)作为参数,你可以使用plot.function:

plot(function(x) x^2)

答案 1 :(得分:21)

您必须查看curve的来源以了解正在发生的事情(只需在提示符下键入curve并按Enter键。)

在那里你可以找到如何解析传递的表达式。

发现函数的唯一方法就是只传递它的名称(参见is.name部分)。如果不是这种情况,则会为每个x调用表达式。在你的情况下:对于每个x,结果都是一个函数,这对于绘图来说并不是一个快乐的想法......

所以简而言之:不,你不能做你尝试过的,但是正如@ROLO指出的那样,你可以立即传递函数体,它将被解析为一个表达式(并且应该包含x)。如果这包含多个语句,只需用大括号括起来。

答案 2 :(得分:1)

R 4.1 开始,您可以使用 \(x) 类似 lambda 的简写:

<块引用>

R 现在提供了用于创建匿名函数的速记符号,
例如\(x) x + 1 被解析为 function(x) x + 1。

使用function(x) x^2

(\(x) x^2)(2)
#[1] 4

这可以与 curve 一起使用:

curve((\(x) x^2)(x))

enter image description here

但正如评论中所述,在这种情况下,表达式更直接:

curve(x^2)