R函数没有返回值

时间:2014-02-04 00:58:13

标签: r function

我正用他的一些代码帮助我的一个朋友。我不知道如何解释这种奇怪的行为,但我可以告诉他,他的功能并没有明确地返回任何东西。这是一个可重复的最小例子:

derp <- function(arg){
  arg <- arg+3
}

data <- derp(500)
data
#[1] 503
derp(500)
#nothing outputs
class(derp(500))
#[1] "numeric"

我可以谷歌这个名字吗?为什么会这样?为什么在调用derp()之后arg没有被销毁?

5 个答案:

答案 0 :(得分:9)

您需要了解返回值的函数与打印该值之间的区别。默认情况下,函数返回最后一个表达式的值,在这种情况下是赋值

arg <- arg + 3

(请注意,在R中,赋值是一个返回值的表达式,在本例中是指定的值。)这就是data <- derp(500)导致data包含503的原因。

但是,默认情况下,返回的值不会打印到屏幕上,除非您将函数的最终表达式隔离在自己的行上。这是R中的一个怪癖。所以如果你想看到这个值:

derp <- function(arg)
{
    arg <- arg + 3
    arg
}

或只是

derp <- function(arg)
arg + 3

答案 1 :(得分:1)

正在销毁arg变量。除非明确调用return语句,否则R中的函数将返回函数中执行的最后一个语句的值。

在您的情况下,arg的副本是您的函数的返回值。例如:

alwaysReturnSomething = function()
{
  x = runif(1)
  if(x<0.5) 20  else 10
}
> for(x in 1:10) cat(alwaysReturnSomething())
20202020102010101020

或:

alwaysReturnSomething <- function(){}
> z=alwaysReturnSomething()
> z
NULL

答案 2 :(得分:1)

这是一种奇怪的行为。

基本上derp(),如果您分配derp()的输出,则会返回,如果您未分配结果,则derp()不会返回。这是因为赋值函数(<-)使用invisible()函数返回。请参阅Make a function return silently了解其工作原理。

您可以在derp2看到相同的行为:

derp2 <- function(arg) {
  invisible(arg + 3)
}
derp2(3)
# nothing
b <- derp2(3)
b
# 6

答案 3 :(得分:0)

如果您希望函数在Global环境中更改变量的值,可以使用<<-运算符,但仍需要在Global环境中编写变量的确切名称

derp <- function(arg){
  arg <- arg+3
  b<<-3
}

尝试并拨打b

答案 4 :(得分:0)

我经常将return(NULL)用于某些一致性检查中包含的函数的开头,例如输出文件是否将被覆盖。例如

some_function <- function(output_filename, overwrite = FALSE) {
  if (file.exists(output_filename)) {
    if (!overwrite) {
      return(NULL)
    }
  }
}

在这种情况下,调用方some_function("file.path", overwrite = FALSE)将返回NULL。您可以通过修改以下内容来避免这种情况:

...
return(invisible(NULL))
...