如何将此lapply
更改为for
循环:
subsignals <- lapply(c(peakind$freqindex, midindex+1), function(x){
upperind <- x
fsub <- f
notnullind <- ((fsub$freqindex >= lowerind
& fsub$freqindex < upperind)
|
(fsub$freqindex > (lindex - upperind + 2)
& fsub$freqindex <= (lindex - lowerind + 2)))
fsub[!notnullind,"coef"] <- 0
lowerind <<- upperind
Re(fft(fsub$coef, inverse=TRUE)/length(fsub$coef))
})
答案 0 :(得分:3)
请注意,这未经过测试,因为如果没有其他数据,您的问题目前无法重现。这里的关键是重新构成提供给函数的x
值。我们通过显式创建要循环的值的向量(loop.vec
)来完成此操作,然后对于循环中的每次迭代,将该向量中的值赋给upperind
(for的第一行)循环)。
f <- # NEED TO ASSIGN f HERE
midindex <- # NEED TO ASSIGN midindex HERE
lindex <- # NEED TO ASSIGN
loop.vec <- c(peakind$freqindex, midindex+1))
subsignals <- vector("list", length(loop.vec)) # pre-allocate
lowerind <- loop.vec[[1]] # I'M GUESSING HERE
for(i in seq_along(loop.vec) {
upperind <- loop.vec[[i]]
fsub <- f
notnullind <- ((fsub$freqindex >= lowerind
& fsub$freqindex < upperind)
|
(fsub$freqindex > (lindex - upperind + 2)
& fsub$freqindex <= (lindex - lowerind + 2)))
fsub[!notnullind,"coef"] <- 0
lowerind <- upperind
subsignals[[i]] <- Re(fft(fsub$coef, inverse=TRUE)/length(fsub$coef))
}
此外,由于我们不再在函数内执行代码,因此我们不再需要进行<<-
全局赋值,因为for循环的环境在迭代之间仍然存在。