我需要使用/学习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中不允许这样的内联使用吗?有没有其他方法可以在不定义额外功能的情况下完成这项工作?谢谢!
答案 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)