如何在嵌套的 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()
)初始化的那个保持不变
换句话说,在函数内部进行的赋值会影响函数的环境,而不是全局环境,除非您明确地做一些事情来改变它。
要分配给父环境,请使用 <<-
而不是 <-
在嵌套的 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()
)初始化的那个保持不变
换句话说,在函数内部进行的赋值会影响函数的环境,而不是全局环境,除非您明确地做一些事情来改变它。
要分配给父环境,请使用 <<-
而不是 <-