讓我們通過實例嘗試:
fac <- function(x) {
f=1
for (i in 1:x) {
f = f * i
print(f)
}
print(f)
}
fac2 <- function(x) {
f=1
for (i in 1:x) {
f = f * i
print(f)
}
return(f)
}
fac3 <- function(x) {
f=1
for (i in 1:x) {
f = f * i
return(f)
}
print(f)
}
,並利用它們:
> f1 <- fac(10)
[1] 1
[1] 2
[1] 6
[1] 24
[1] 120
[1] 720
[1] 5040
[1] 40320
[1] 362880
[1] 3628800
[1] 3628800
> f2 <- fac2(10)
[1] 1
[1] 2
[1] 6
[1] 24
[1] 120
[1] 720
[1] 5040
[1] 40320
[1] 362880
[1] 3628800
> f3 <- fac3(10)
> f1
[1] 3628800
> f2
[1] 3628800
> f3
[1] 1
print
,因爲它的名字暗示的打印到控制檯(並返回打印的值)
return
只返回值並結束該功能。
在fac(10)
的情況下,最後print
是f
最後一個值,並返回它,因爲fac2(10)
確實有區別,因爲只有在迴路印刷的價值print
它並不打印兩次。
fac3(10)
在第一次迭代時返回,因此它永遠不會去print
語句並返回第一個值而不打印任何內容到控制檯。
你能爲這個做的是:
fixedfac <- function(x) {
f=vector('numeric',x) # pre allocate the return vector to avoid copy while growing in the loop
tmp=1 # use a temp var for the maths (could be avoided, but it's to keep it simple)
for (i in 1:x) {
tmp <- tmp * i # do the math
f[i] <- tmp # store in result
}
f # return the vector with all values (we need at least this as for does not return anything).
}
將返回一個向量(return
是不必要的,因爲一個函數總是返回其最後一個語句的值)
> fixedfac(10)
[1] 1 2 6 24 120 720 5040 40320 362880 3628800
好答案!值得注意的是'print'是R中的泛型函數,而'return'不是。什麼'print'傳遞給控制檯取決於它所應用的對象的類別,並且打印的內容可能與返回值不同(即,「print」也是不可見的返回並不總是意味着它「打印它兩次」就像你說的那樣)。而且,'return'只能從函數內部調用,而'print'幾乎可以在任何地方運行。 – SimonG
@SimonG我說的是打印兩次的意思是在fac1中,在循環中打印呼叫,在功能結束時打印呼叫,因此在fac2中打印兩次,因爲我們有返回而不是打印它沒有打印兩次。 – Tensibai
@SimonG在這一點上,我可以寫一個完整的書籍與微妙的印刷和回報,將太長的答案:)我希望我給足夠的線索,讓讀者挖掘在這兩個文檔:) – Tensibai