将lapply函数更改为for循环

时间:2014-01-14 14:14:38

标签: r apply

如何将此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))
})

1 个答案:

答案 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循环的环境在迭代之间仍然存在。