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
这会在编译后的代码中进行循环,因此速度快了很多个数量级。
不幸的是,我是过度循环的受害者。我相信可以通过在 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
这会在编译后的代码中进行循环,因此速度快了很多个数量级。