2016-03-03 80 views
1

我已經定義了一個階乘函數。該腳本是這樣的:R中打印和退貨的區別?

fac <- function(x) { 
    f=1 
    for (i in 1:x) { 
    f = f * i 
    print(f) 
    } 
    print(f) 
} 

如果FAC(5),那麼輸出看起來是這樣的:

[1] 1 
[1] 2 
[1] 6 
[1] 24 
[1] 120 
[1] 720 
[1] 5040 

但是,當我改變 '打印(F)' 部分爲「迴歸(F )'的輸出是:

[1] 1 

爲什麼會發生這種情況? R中的打印和返回有區別嗎?

回答

0

當然,printreturn之間有區別。從R文檔:「print打印其參數,並無形地返回(通過invisible(x))。」所以它打印值並將其​​返回給控制檯。同時return函數的基礎職責是返回值。如果它沒有分配給變量,它會轉到控制檯。

因此,當您將print更換爲return時,您的功能將在return上制動,並且值不會進一步運行。

嘗試將值分配給一些變量看出差別 a <- fac(5)

4

讓我們通過實例嘗試:

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)的情況下,最後printf最後一個值,並返回它,因爲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 
+0

好答案!值得注意的是'print'是R中的泛型函數,而'return'不是。什麼'print'傳遞給控制檯取決於它所應用的對象的類別,並且打印的內容可能與返回值不同(即,「print」也是不可見的返回並不總是意味着它「打印它兩次」就像你說的那樣)。而且,'return'只能從函數內部調用,而'print'幾乎可以在任何地方運行。 – SimonG

+0

@SimonG我說的是打印兩次的意思是在fac1中,在循環中打印呼叫,在功能結束時打印呼叫,因此在fac2中打印兩次,因爲我們有返回而不是打印它沒有打印兩次。 – Tensibai

+0

@SimonG在這一點上,我可以寫一個完整的書籍與微妙的印刷和回報,將太長的答案:)我希望我給足夠的線索,讓讀者挖掘在這兩個文檔:) – Tensibai

0

在r打印接受您提供的值並確定它將如何將該變量中的項目打印到命令行中,以查看變量中的值。返回值會將該值返回給函數的調用者,但該值必須存儲在變量中,或者可以直接傳送到另一個函數中。

fac <- function(x) { 
    f=1 
    for (i in 1:x) { 
    f = f * i 
    print(f) 
    } 
    return(f) 
} 

FAC(10)工作就好了,並取得了3628800

+0

或者OP可能只是替換所有帶有'return'語句的'print'語句? (因此在第一次迭代中停止...) – Tensibai

相關問題