我在玩了一下 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/