这可能与懒惰评估有关,但这绝对不是我所期望的。它也可能与在每个输入行的末尾生成隐式分号的行为有关。
> (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)),并将计算推迟到指定参数之后。如果行中的最后一项是(,但如果(是下一行中的第一项,则不会执行此操作。
因此,基本上这些)(必须在第一行或第二行一起,才能识别正在进行的匿名调用。从某种意义上讲,应该是显式的;像perl一样终止,等等。
这个例子对于exposition来说有点微不足道。一个人可以把所有的东西放在一行上,然后就完成了。当试图维护一种函数式编程风格时,这个问题就不那么微不足道了,在这种风格中,参数不是10,而是另一个(或多个)匿名函数的输出。
发布于 2018-03-29 06:54:38
与懒惰评估无关。这就是交互式阅读过程的设置方式。它等待,而不是等到函数指定了它们的参数,而是等到有一个完整的表达式将返回值。因为一个函数是一个合法的值,所以它会返回该值。当source-ing from afile时,操作是不同的。该操作没有read-eval-print。它更像是一个parse-eval-act循环。(我以为这是在R-FAQ中,但到目前为止我还没有找到它。在我找到更好的参考资料之前,我建议您参考?source,其中讨论了文件处理和命令行处理之间的区别。)如果您想建立一种避免这种歧义的风格,那么可以在参数列表规范后面使用"{"。(我认为当您搞砸的时候,它会给您更多的信息。)
https://stackoverflow.com/questions/49545260
复制相似问题