我需要使用/学习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'
Run Code Online (Sandbox Code Playgroud)
然而,当我首先将函数存储在变量中时,它可以工作:
> quad <- function(x) x^2
> curve( quad )
Run Code Online (Sandbox Code Playgroud)
在R中是不允许这样的内联使用?有没有其他方法可以在不定义额外功能的情况下完成这项工作?谢谢!
leb*_*nok 46
只是为了完整.您可以在R中使用"lambda-like"(匿名)函数,但是如果要将它们立即使用,则需要将函数定义括在括号或花括号中:
(function (x) x+1) (1)
{function (x,y) x^y} (2,3)
Run Code Online (Sandbox Code Playgroud)
如果curve第一个参数是表达式或函数名称 - 但如果它是函数名称,则它首先转换为表达式.(参见源代码中的前几行curve).所以,如果它'不是函数名,你需要一个表达式 - 它可能包含一个"lambda"函数:
curve((function (x) x^2)(x))
Run Code Online (Sandbox Code Playgroud)
如果要使用函数(而不是其名称)作为参数,可以使用plot.function:
plot(function(x) x^2)
Run Code Online (Sandbox Code Playgroud)
Wal*_*ldi 38
从R 4.1现在开始,您可以使用\(x)类似 lambda 的简写:
R 现在提供了用于创建匿名函数的简写符号,
例如 \(x) x + 1 被解析为 function(x) x + 1。
和function(x) x^2:
(\(x) x^2)(2)
#[1] 4
Run Code Online (Sandbox Code Playgroud)
这可以与以下命令一起使用curve:
curve((\(x) x^2)(x))
Run Code Online (Sandbox Code Playgroud)
但正如评论中所述,在这种情况下,表达式更简单:
curve(x^2)
Run Code Online (Sandbox Code Playgroud)
Nic*_*bbe 21
您必须查看curve要了解正在发生的事情的来源(只需curve在提示符处键入并按Enter键).
在那里,您可以找到解析表达式的方式.
发现函数的唯一方法就是只传递它的名称(参见is.name参考资料部分).如果不是这种情况,则会为每个人调用表达式x.在你的情况下:对于每一个x,结果都是一个函数,这对于绘图来说并不是一个快乐的想法......
所以简而言之:不,你不能做你尝试过的,但是正如@ROLO指出的那样,你可以立即传递函数体,它将被解析为一个表达式(并且应该包含x).如果这包含多个语句,只需将它们括在大括号中即可.