在嵌套的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"
答案 0 :(得分:3)
bucket
和函数内部的bucket
不一定是同一个东西。在函数内部,您bucket <- c(bucket, genelist.info.u[x, "Gene"])
的调用会更新该函数中的bucket
。因为您最后没有返回bucket
,所以您在全局环境中首次初始化的那个(bucket <- vector()
)保持不变。
换句话说,在函数内部进行的赋值会影响函数的环境,而不会影响全局环境,除非您明确地做了改变它的事情。
要分配给父级环境,请使用<<-
代替<-