R中的三嵌套循环

Tri-nested loop in R

目前,我正在编写一个在 R 中使用三嵌套循环的函数;但是,它似乎有一些奇怪的行为。我注意到以下问题:

1) 基因似乎没有在循环结束时附加到 gene.out,我从 gene.out 得到的列表是 gene.use。

2) cond ONLY 复制(即 22_22、35_35、等等)

据我所知,这些事情都不应该在第三个循环中发生。这是一些奇怪的 R 循环行为还是编码错误?

这里是有问题的代码:

for (gene in genes.use){

    for (i in groups){
      cat(paste("i: ",i, "\n"))

      i_cells = rownames(SerautObj@meta.data[SerautObj@meta.data[[group.by]] == i,])
      i_vector = SerautObj@assays[[assay]]@data[gene, i_cells]

      for(j in groups){
        cat(paste("j: ",j, "\n"))

        j_cells = rownames(SerautObj@meta.data[SerautObj@meta.data[[group.by]] == j,])
        j_vector = SerautObj@assays[[assay]]@data[gene, j_cells]


        cond = paste(i, j, sep = "_")
        cat(paste(gene, cond, sep = "\n"))

        #preform t-test
        t_out = t.test(i_vector, j_vector)

        #constuct outs

        condition.out <- c(condition.out, cond)



        stat.out <- c(stat.out, t_out[["statistic"]])
        p_val.out <- c(p_val.out, t_out[["p.value"]])
        gene.out <- c(gene.out, gene)
        }
    }
}

编辑:

忘记包括,当我在 i 循环中执行 print(paste("i: ", i) 和 print(paste("j: ", j)) 我得到:

我:组1
我:组 2
i: group3
j: group1
j: group2
j: group3

来自https://satijalab.org/seurat/v3.1/pbmc3k_tutorial.html的玩具套装数据:

SerautObj@meta.data
structure(list(orig.ident = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), .Label = "pbmc3k", class = "factor"), nCount_RNA = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), nFeature_RNA = c(0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L), group = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 
5)), row.names = c("AAACATACAACCAC", "AAACATTGAGCTAC", "AAACATTGATCAGC", 
"AAACCGTGCTTCCG", "AAACCGTGTATGCG", "AAACGCACTGGTAC", "AAACGCTGACCAGT", 
"AAACGCTGGTTCTT", "AAACGCTGTAGCCA", "AAACGCTGTTTCTG"), class = "data.frame")

SerautObj@assays[[assay]]@data

    new("dgCMatrix", i = integer(0), p = c(0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L), Dim = c(10L, 10L), Dimnames = list(c("AL627309.1", 
"AP006222.2", "RP11-206L10.2", "RP11-206L10.9", "LINC00115", 
"NOC2L", "KLHL17", "PLEKHN1", "RP11-54O7.17", "HES4"), c("AAACATACAACCAC", 
"AAACATTGAGCTAC", "AAACATTGATCAGC", "AAACCGTGCTTCCG", "AAACCGTGTATGCG", 
"AAACGCACTGGTAC", "AAACGCTGACCAGT", "AAACGCTGGTTCTT", "AAACGCTGTAGCCA", 
"AAACGCTGTTTCTG")), x = numeric(0), factors = list())

genes.use = c("PLEKHN1", "HES4", "NOC2L")
groups = Map(c, unique(SerautObj@meta.data$groups))

感谢阅读!

原来问题出在:

Map(c, unique(SerautObj@meta.data$groups))

然后我尝试了:

as.list(unique(SerautObj[["time"]]))

这有同样的问题,但已解决:

unlist(as.list(unique(SerautObj[["time"]])))

列表上的 for 循环行为似乎很奇怪,您需要转到原子类型向量,否则可能会出现重复项。我猜发生了一些奇怪的引用或列表循环的事情。