2014-09-02 62 views
0

想知道我是否在for循環中創建一個對象 - 即不必初始化它。我已經嘗試了這個如何在matlab中做到這一點。請參閱下列R-代碼:是否需要在for循環中初始化一個對象R

> for (i in 1:nrow(snp.ids)) { 
+ snp.fasta[i]<-entrez_fetch(db="protein", id=snp.ids[i,], rettype="xml",retmode="text") 
+ snp.seq[i]<-xpathSApply(xmlParse(snp.fasta[i]), "//Seq-data_iupacaa",xmlValue) 
+ } 
Error in snp.fasta[i] <- entrez_fetch(db = "protein", id = snp.ids[i, : 
    object 'snp.fasta' not found 

它顯然沒有找到snp.fasta - 但你可以從我試圖創建snp.fasta代碼中看到。任何人都可以闡明爲什麼它不會在內部創建它。 for循環,以及如果我無法在for循環中創建snp.fasta,那麼正確的方法是什麼。

感謝

+2

有辦法做到這一點,但我想不出有什麼好處。既然你已經知道了'snp.fasta'的大小,你可以用適當的長度初始化它,例如'snp.fasta < - vector();在你的循環之前使用長度(snp.fasta)< - nrow(snp.ids)'來避免與遞增增量矢量有關的內存分配開銷。 – nrussell 2014-09-02 20:06:37

+0

謝謝 - 這對我來說很有意義。在matlab中,我一直在for循環中創建它,但也許我不應該這樣做! – brucezepplin 2014-09-02 20:13:33

回答

2

一般情況下,是的。這將是一個可接受的方式來循環一個ID向量。只分配給一個非索引對象。

for (i in 1:nrow(snp.ids)) { 
snp.fasta <- entrez_fetch(db="protein", id=snp.ids[i,], rettype="xml",retmode="text") 
snp.seq <- xpathSApply(xmlParse(snp.fasta), "//Seq-data_iupacaa",xmlValue) 
} 

(然後,您仍然需要任何有用的結果分配給一個指標,能夠對象或內循環建立的這樣一個序列或打印一些結果。目前的情況是這樣的示例將通過寫所有的值snp.seq,只留下最後一個。)

看到id=snp.ids[i,]有點困惑。這意味着snp.ids的維數爲2.我會期望使用列名或數字:id=snp.ids[i,"id"]。你應該提供dput(head(snp.ids)),所以我們可以做一些現實的測試,而不是這半誤的猜測。

0

循環之前:

snp.fasta <- NULL 
1

在R,子集也是一個函數,在一個載體中,從而分配值中的項目:

a[1] = 123 

相同

"["(a, 1) = 123 

[這裏是一個正常功能。如果未定義a,則會出現錯誤。