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 關注
- 744 瀏覽
添加回答
舉報