是否需要在R中循环之前初始化对象

时间:2014-09-02 19:59:32

标签: r for-loop initialization

我想知道我是否在for循环中创建一个对象 - 即不必初始化它。我试过这个怎么可能在matlab中做到这一点。请参阅以下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的正确方法是什么。

由于

3 个答案:

答案 0 :(得分: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))所以我们可以做一些现实的测试,而不是这种半猜测的猜测。

答案 1 :(得分:1)

在R中,子集化也是一个函数,因此为向量中的项目赋值:

a[1] = 123

相同
"["(a, 1) = 123 

此处[是正常功能。如果未定义a,则会出错。

答案 2 :(得分:0)

循环之前:

snp.fasta <- NULL