R中的lambda函数?

pok*_*oke 34 lambda r

我需要使用/学习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)

  • 使用`magrittr`,现在可以使用`1%>%{.+ 1}`而不是`{function(x)x + 1}(1)` (7认同)

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).如果这包含多个语句,只需将它们括在大括号中即可.