我剛剛開始學習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
的末尾並返回一個向量。有人能指出這個代碼有什麼問題嗎?
我剛剛開始學習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
的末尾並返回一個向量。有人能指出這個代碼有什麼問題嗎?
因爲您沒有使用任務,所以您沒有在循環中放入任何東西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("^")
7個字符... pfft。浪費了! – thelatemail
@thelatemail - 我覺得我可能在那裏做得太過分了。哈哈 –
@RichardScriven謝謝你的解釋。我想知道爲什麼'<-'被使用,並且不能在R中使用'='?那我不能編碼爲'y = i * i'嗎?是否有必要像'y <-i * i' –
你從來沒有把任何東西里面'M <體 - c()'。 –
我想你想'm < - c(m,y)'而不是'c(m,y)'。這就是說,你實際上不應該通過一次追加一個元素來構建矢量 - 參見[R地獄]的第二個圓圈(http://www.burns-stat.com/pages/Tutor/R_inferno.pdf )瞭解詳情。 R的美的一部分是它的向量化操作 - 你可以做'平方< - 函數(x)x^2'。這不僅少得多,而且效率也更高。 – josliber