繁体   English   中英

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。 返回类应该是一个向量。

实际上,F1具有数百万个值,此外,我有一些与此类似的计算。 因此,如果有人可以提出有效的解决方案,我将不胜感激。

最好,丹尼尔。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM