2015-09-03 72 views
1

我剛剛開始學習R,並且編寫了此代碼以學習函數和循環。將值添加到R中的向量for循環中

squared<-function(x){ 
    m<-c() 
    for(i in 1:x){ 
    y<-i*i 
    c(m,y) 
    } 
    return (m) 
} 
squared(5) 

NULL 

爲什麼這會返回NULL。我想要i*i值追加到m的末尾並返回一個向量。有人能指出這個代碼有什麼問題嗎?

+1

你從來沒有把任何東西里面'M <體 - c()'。 –

+3

我想你想'm < - c(m,y)'而不是'c(m,y)'。這就是說,你實際上不應該通過一次追加一個元素來構建矢量 - 參見[R地獄]的第二個圓圈(http://www.burns-stat.com/pages/Tutor/R_inferno.pdf )瞭解詳情。 R的美的一部分是它的向量化操作 - 你可以做'平方< - 函數(x)x^2'。這不僅少得多,而且效率也更高。 – josliber

回答

3

因爲您沒有使用任務,所以您沒有在循環中放入任何東西m <- c()。你得到如下 -

m <- c() 
m 
# NULL 

您可以更改功能通過在循環分配m返回所需的值。

squared <- function(x) { 
    m <- c() 
    for(i in 1:x) { 
     y <- i * i 
     m <- c(m, y) 
    } 
    return(m) 
} 

squared(5) 
# [1] 1 4 9 16 25 

但是,這是低效的,因爲我們知道所得到的矢量的長度將是5(或x)。所以我們希望在循環之前先分配內存。這將是使用for()循環的更好方法。

squared <- function(x) { 
    m <- vector("integer", x) 
    for(i in seq_len(x)) { 
     m[i] <- i * i 
    } 
    m 
} 

squared(5) 
# [1] 1 4 9 16 25 

另請注意,我已從第二個函數中刪除了return()。這不是必需的,所以它可以被刪除。在這種情況下離開它是個人喜好的問題。有時候這將是必要的,例如在if()報表中。

我知道這個問題是關於循環,但我也不得不提,這可以更有效地利用原始^七個字符來完成,像這樣

(1:5)^2 
# [1] 1 4 9 16 25 

^是一種原始的功能,這意味着代碼是用C寫的全部,將是最有效的三種方法

`^` 
# function (e1, e2) .Primitive("^") 
+1

7個字符... pfft。浪費了! – thelatemail

+0

@thelatemail - 我覺得我可能在那裏做得太過分了。哈哈 –

+0

@RichardScriven謝謝你的解釋。我想知道爲什麼'<-'被使用,並且不能在R中使用'='?那我不能編碼爲'y = i * i'嗎?是否有必要像'y <-i * i' –