R 将用户定义的函数应用于向量;在 sapply() 中建立索引

R Applying user defined function to vector; Indexing within sapply()

不幸的是,我是过度循环的受害者。我相信可以通过在 R 中使用 sapply() 函数来改进以下计算。但是,我在索引方面遇到了一些问题。以下是对分子模拟的每个时间步完成的功的计算。这是循环形式的解决方案:

F1 <- c(0.38603555, 0.06516336, 0.55603406, 0.52901992)
wd <- vector(mode="numeric", length=length(F1))
ts <- 0.198
ve <- 0.0015

for(i in 1:length(F1)){

    if(i == 1){
    wd[i] <- (F1[i] * ve * ts)  
    } else {
    wd[i] <- wd[i-1] + (F1[i] * ve * ts) 
    }

}

工作得很好。我的sapply()形式的错误尝试如下:

F1[1] <- (F1[1] * ve * ts)
wd    <- sapply(F1[2:length(F1)], function(x) x[-1] + (x * ve * ts))

我认为问题出在索引 x 上。 return class 应该是一个向量。

现实中F1有几百万个值,另外我也有几个类似的计算。因此,如果有人能提出有效的解决方案,我将不胜感激。

最好的, 丹尼尔.

这里使用sapply没有性能优势。这只是另一个循环。而是使用矢量化:

all.equal(wd,
          cumsum(F1 * ve * ts)
         )
#[1] TRUE

这会在编译后的代码中进行循环,因此速度快了很多个数量级。