r - 在R中使用 '->'运算符定义函数需要括号才能工作

标签 r syntax

我在玩了一下 R 及其赋值运算符,我发现如果我想使用 -> 运算符将函数写入变量,我需要将定义括起来像这样的括号:

(function(x) {
return(x)
}) -> my_func

my_func("hi")

以下内容无法按预期工作:

function(x) {
    return(x)
} -> my_func

my_func("hi")

输出对我来说似乎也很奇怪:

function (x)  my_func <- {
    return(x) }

Error in eval(expr, envir, enclos): could not find function "my_func" Traceback:

有人知道这是为什么吗?我的猜测是,这与运算符的优先级和结合性有关,但我无法确定它......

最佳答案

R 中“函数”的文档显示了以下用法

function( arglist ) expr

所以基本上 function() 之后的所有内容将被解释为表达式并用作函数体。碰巧赋值运算符可以被解释为该表达式的一部分。请注意,这是 R 中的有效表达式

{1 - 2} -> x

因此,您基本上是在定义一个执行分配的函数。您不是通过评估该语句来创建的——只是定义了一个未命名的函数。所以对于你的例子

function(x) {
    x
} -> my_func

这条线神经创建了一个名为 my_func 的变量。它创建一个函数,该函数将分配给名为 my_func 的变量。但该变量仅存在于函数作用域中,并且在函数运行结束后将不可用。

在您的实际示例中,您使用了 return这样局部变量实际上永远不会被创建,因为 return()发生在赋值完成之前的代码块中。但如果你做了一个全局任务,那就更清楚了

if (exists("my_func")) rm(my_func)
exists("my_func")
# [1] FALSE
f <- function(x) {
    x
} ->> my_func
f(5)
exists("my_func")
# [1] TRUE

但是您可以看到,如果您运行,则永远不会创建该变量

if (exists("my_func")) rm(my_func)
function(x) {
    x
} -> my_func
exists("my_func")
# [1] FALSE

当您使用x <- function() {}时之后有一个新行,这是一个明显的中断,因此解析器知道表达式在哪里结束。添加()也使解析清楚函数表达式的结束位置,因此 R 也不会将赋值吞入表达式(函数体)中。 R 中的函数不需要花括号或显式 return()来电:function(x) x是一个有效的函数定义。

关于r - 在R中使用 '->'运算符定义函数需要括号才能工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46100315/

相关文章:

r - 如何使用 R 从网络日志文件中绘制每秒请求数的图表

javascript - javascript函数调用的语法差异?

R read.table csv with classic-mac 行结尾

java - 误解如何使用构造函数(无参数)

javascript - 未捕获的语法错误 : Unexpected identifier in empty line?

c++ - 弄清楚 C++ 集

Python 测试 url 和图像类型

r - 计算矩阵的逆 : system is computationally singular [error]

r - 使用 read_excel "Error: std::bad_alloc"的错误信息

r - stargazer summary.stat 重新标记列标题