【问题标题】:Return syntax quirk in R在 R 中返回语法怪癖
【发布时间】:2018-01-12 06:20:26
【问题描述】:

您可以在R中使用以下代码创建一个函数,省略return命令后的括号,但return语句的行为与预期不符,似乎什么也不做:

> func <- function(x) { return; print(x) }
> func(1)
[1] 1

包含括号的行为符合预期:

> func <- function(x) { return(); print(x)}
> func(1)
NULL

为什么?没有参数的 return 语句是否有目的,如果没有,为什么它不会导致异常?

【问题讨论】:

  • 在第一种情况下,return 没有做任何事情,因为没有参数并且函数没有执行。这就像在控制台上调用 returnfunc &lt;- function(x) { print(return)}; func(1)# .Primitive("return") 在第二种情况下,它在参数中没有任何内容。所以它打印 NULL
  • @akrun 所以一般来说调用一个没有任何参数的函数只是作为一个空操作?
  • @TimBiegeleisen 我想是的。例如f1 &lt;- function(x) {print(mean)};f1(1)# function (x, ...) UseMethod("mean");
  • 在第一个示例中,您没有调用 return。你期待什么?
  • 我想要得到的是,如果这什么都不做,为什么它甚至是有效的语法?为什么不只是崩溃?它有我不知道的目的吗?

标签: r syntax return


【解决方案1】:

我也许可以提供一些见解。除了在 R 中拥有一个没有参数的函数本身是合法的之外,在没有赋值、函数调用等的行上有一个 variable 也是合法的。考虑以下代码 sn -p:

x <- c(1,2,3)
x
print(x)
print

这是输出:

[1] 1 2 3
[1] 1 2 3
function (x, ...) 
UseMethod("print")
<bytecode: 0xbb87b8>
<environment: namespace:base>

换句话说,在控制台中,变量或函数本身的默认行为是打印有关该变量或函数的信息。因此,在这种情况下明确定义了行为,并且似乎没有调用该函数。当这发生在另一个函数中时,这可能就没有意义了,尽管 R 似乎已经为此定义了行为。

【讨论】:

  • 当你在控制台命名一个对象时,你会隐式调用它的print方法。所以控制台上的object 等价于print(object)。由于print 是一个泛型函数,它的作用与object 的类一致。所以,如果你在控制台命名一个函数,print.function 就会被调用。
  • @nicola 那么函数内部发生的行为可能是无操作。我的基本观点是这样的语法似乎是合法的 R.
  • 当然可以。我在 OP 中看不到一点,除非他们错过了 return 只是一个常规函数而不是关键字。你是对的,只是在函数中命名一个对象没有任何作用。这当然与return 没有任何关系。
【解决方案2】:

function(x) { return(); print(x) } 调用 return() 作为函数。 function(x) { return; print(x) } 引用 return 作为普通对象。这就是区别。

return # Just show the function body.
## .Primitive("return")
return() # Actually call the function.
## Error: no function to return from, jumping to top level

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-27
    • 2013-11-16
    • 2023-03-31
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多