我正用他的一些代码帮助我的一个朋友。我不知道如何解释这种奇怪的行为,但我可以告诉他,他的功能并没有明确地返回任何东西。这是一个可重复的最小例子:
derp <- function(arg){
arg <- arg+3
}
data <- derp(500)
data
#[1] 503
derp(500)
#nothing outputs
class(derp(500))
#[1] "numeric"
我可以谷歌这个名字吗?为什么会这样?为什么在调用derp()之后arg没有被销毁?
答案 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))
...