解析R中的匿名函数评估

时间:2018-03-28 22:36:15

标签: r

这可能与懒惰评估有关,但绝对不是我所期待的。它也可能与在每个输入行的末尾产生隐式分号的行为有关。

> (function(x) x * 10)(10)
[1] 100

预期。

> function(x) x * 10
function(x) x * 10

预期。

> (function(x) x * 10)
function(x) x * 10

这里他剥离了()并进行评估,假设没有实际可以遵循

> (function(x) x * 10
+ )(10)
[1] 100

省略结束)他等待它和实际情况。

> (function(x) x * 10)
function(x) x * 10
> (10)
[1] 10

但不是如果)在同一条线上。

> (function(x) x * 10)(
+ 10)
[1] 100

但是(对于实际值可以在第一行,行为是预期的。

我原本希望解析器识别正在进行的匿名函数调用(f(x))并暂停评估,直到指定了参数。如果线上的最后一件事是(但不是如果(是下一行中的第一件事),它会这样做。

所以基本上这些)(必须在第一行或第二行一起,以便它识别正在进行的匿名调用。明确的争论;终止ala perl等等。

这个例子对于阐述来说有点微不足道。人们可以把它全部放在一条线上并完成它。在尝试维护参数不是10但是另一个匿名函数(或几个)的输出的函数式编程风格时,问题并不是那么微不足道。

1 个答案:

答案 0 :(得分:2)

与懒惰评估无关。这就是交互式阅读过程的设置方式。它等待,直到函数指定了它们的参数,而不是直到有一个完整的表达式返回一个值。由于函数是合法值,因此返回该函数。当source来自afile时,行动是不同的。该操作没有read-eval-print。它更像是一个parse-eval-act循环。 (我认为这是在R-FAQ中,但到目前为止我找不到它。直到我找到更好的参考,我会把你推荐给?source,其中文件处理和命令之间存在差异讨论了行处理。)如果你想建立一个避免这种歧义的样式,那么在参数列表规范之后立即使用"{"。(我认为当你搞砸时它会给你提供更多信息性错误信息。)