2013-05-29 145 views
0

我在輸出分配問題在「for」循環中掙扎:我生成一個空矩陣(「結果」)與適當的(不是???)尺寸在哪裏循環應該從功能分配輸出(PLS),但我得到一個錯誤...這裏是代碼:「For」循環輸出問題在R

library(pls) 
set.seed(10000) 
mat <- replicate(100, rnorm(100)) 
y <- as.matrix(mat[,1], drop=F) 
x <- mat[,2:100] 
min.nc <- 3 
max.nc <- 8 
nc <- seq(min.nc, max.nc) 
results <- matrix(NA, length(nc), 1) 
for(q in nc) { 
    pls <- plsr(y ~ x, ncomp = q) 
    results[q,] <- RMSEP(pls, intercept=F, estimate="train")$val[1,1,q] 
} 

運行後,該錯誤消息「for」循環說:

Error in `[<-`(`*tmp*`, q, , value = 0.329631604369802) : 
    subscript out of bounds 

......我不明白,因爲迭代器「nc」具有「length(nc)」的大小。有任何想法嗎?

非常感謝您的時間和幫助!

Chega

回答

4

q爲3:8,你的矩陣results爲1:6。因此,當它試圖分配results[q,]q > 6你得到這個錯誤。

> results[7,] 
Error in results[7, ] : subscript out of bounds 

q的值是nc而非seq_along(nc)每個值。

for (q in nc) print(q) 

對戰

for (q in seq_along(nc)) print(nc[q]) 
+1

所以seq_along()是工具,我顯然缺少的!非常感謝您的幫助! – Chega

+0

幼稚的方法是'1:length(nc)',但如果'nc'長度爲0或不存在,這將會以令人驚訝的方式失敗。 – Justin

+0

我看到 - 在大多數情況下,我可以使用seq_along()和seq_len(),當1:length()似乎很方便時... – Chega