如何在嵌套的 lapply/sapply 函数中追加值?

How to append value within nested lapply/sapply function?

在嵌套的 lapply/apply 函数中调用时,为什么我无法将值附加到空向量?我有一个空向量 bucket,我想将值推入其中,但是,输出显示每次迭代都会重新初始化 bucket。如果能深入了解我做错了什么,我将不胜感激。

head(genelist.info.u)
#                   Gene Chromosome       TSS       TES Strand ExternalGeneID
#           142     TAL1       chr1  47697387  47681962     -1           TAL1
#           294    TGFB2       chr1 218519577 218617961      1          TGFB2
#           735   SPAG17       chr1 118507433 118496484     -1         SPAG17
#           749 ANKRD34A       chr1 145470508 145475646      1       ANKRD34A
#           757    RCSD1       chr1 167599330 167675486      1          RCSD1
#           763     LHX9       chr1 197881037 197887120      1           LHX9

bucket <- vector()
newlist <- lapply(chr, FUN=function(u){
     genelist.info.u <- genelist.info[[u]]
     if(dim(genelist.info.u)[1] > 0){
          cov.chr <- sapply(1:nrow(genelist.info.u), FUN=function(x){
               if(genelist.info.u[x, "Strand"] == 1){
                    #do something
               }else{
                    #do something else
               }
               print(paste0("gene: ", genelist.info.u[x, "Gene"]))
               bucket <- c(bucket, genelist.info.u[x, "Gene"])
               print(paste0("bucket: ", bucket))
               return(gene.coverage)
          })
          return(cov.chr)
     }
})

> bucket
logical(0)

Output:
[1] "gene: TAL1"
[1] "bucket: TAL1"
[1] "gene: TGFB2"
[1] "bucket: TGFB2"
[1] "gene: SPAG17"
[1] "bucket: SPAG17"
[1] "gene: ANKRD34A"
[1] "bucket: ANKRD34A"
[1] "gene: RCSD1"
[1] "bucket: RCSD1"
[1] "gene: LHX9"
[1] "bucket: LHX9"
[1] "gene: NOTO"
[1] "bucket: NOTO"
[1] "gene: OTX1"

bucket 在函数外声明和在函数内声明 bucket 不一定是一回事。在函数内部时,您对 bucket <- c(bucket, genelist.info.u[x, "Gene"]) 的调用会更新该函数中的 bucket 。因为你最后没有returnbucket,所以你一开始在全局环境(withbucket <- vector())初始化的那个保持不变

换句话说,在函数内部进行的赋值会影响函数的环境,而不是全局环境,除非您明确地做一些事情来改变它。

要分配给父环境,请使用 <<- 而不是 <-