3 回答
TA贡献1851条经验 获得超4个赞
如果每个人都同意
return 在函数主体的末尾不需要
不使用return的速度稍微快一些(根据@Alan的测试,相对于5.1秒为4.3微秒)
我们都应该return在函数结尾处停止使用吗?我当然不会,我想解释原因。我希望听到其他人是否也同意我的看法。如果这不是对OP的直接答案,而是更长时间的主观评论,我深表歉意。
我不使用的主要问题return是,正如Paul指出的那样,函数主体中可能还有其他地方需要使用它。而且,如果您被迫return在函数中间使用某个地方,为什么不使所有return语句都明确?我讨厌前后矛盾。我也认为代码读起来更好;可以扫描功能并轻松查看所有出口点和值。
保罗使用以下示例:
foo = function() {
if(a) {
return(a)
} else {
return(b)
}
}
不幸的是,可能有人指出它可以很容易地重写为:
foo = function() {
if(a) {
output <- a
} else {
output <- b
}
output
}
后一种版本甚至符合一些编程编码标准,这些标准倡导每个函数一个返回语句。我认为一个更好的例子可能是:
bar <- function() {
while (a) {
do_stuff
for (b) {
do_stuff
if (c) return(1)
for (d) {
do_stuff
if (e) return(2)
}
}
}
return(3)
}
使用单个return语句重写起来会更加困难:它将需要多个breaks和复杂的布尔变量系统来传播它们。所有这一切都说明单一返回规则不能很好地与R配合使用。因此,如果您需要return在函数主体的某些位置使用它,为什么不保持一致并在各处使用它呢?
我认为速度参数是无效的。当您开始查看实际上可以执行某些功能的函数时,0.8微秒的差异并不算什么。我能看到的最后一件事是输入更少,但是,我并不懒惰。
TA贡献1813条经验 获得超2个赞
似乎没有return()它会更快...
library(rbenchmark)
x <- 1
foo <- function(value) {
return(value)
}
fuu <- function(value) {
value
}
benchmark(foo(x),fuu(x),replications=1e7)
test replications elapsed relative user.self sys.self user.child sys.child
1 foo(x) 10000000 51.36 1.185322 51.11 0.11 0 0
2 fuu(x) 10000000 43.33 1.000000 42.97 0.05 0 0
____ 编辑__ _ __ _ __ _ __ __ _ __ _ ___
我继续进行其他基准测试(benchmark(fuu(x),foo(x),replications=1e7)),结果相反...我将在服务器上尝试。
- 3 回答
- 0 关注
- 710 浏览
添加回答
举报