为R中的矩阵分配数据的循环加速

为R中的矩阵分配数据的循环加速,r,performance,for-loop,matrix,R,Performance,For Loop,Matrix,我正在模拟数据,并使用R中的for循环填充矩阵。当前循环运行速度比我希望的慢。我已经做了一些工作来矢量化一些变量,以提高循环速度,但仍然需要一些时间。我相信 mat[j,year] <- sum(vec==1)/x 循环的一部分是减慢速度。我已经研究过如何更有效地填充矩阵,但找不到任何有助于解决当前问题的方法。最终,这将作为一个闪亮的应用程序的一部分使用,所以我分配的所有变量都需要轻松地分配不同的值 任何加速循环或更有效地编写循环的建议都将不胜感激 以下是循环: #These varia

我正在模拟数据,并使用R中的for循环填充矩阵。当前循环运行速度比我希望的慢。我已经做了一些工作来矢量化一些变量,以提高循环速度,但仍然需要一些时间。我相信

mat[j,year] <- sum(vec==1)/x
循环的一部分是减慢速度。我已经研究过如何更有效地填充矩阵,但找不到任何有助于解决当前问题的方法。最终,这将作为一个闪亮的应用程序的一部分使用,所以我分配的所有变量都需要轻松地分配不同的值

任何加速循环或更有效地编写循环的建议都将不胜感激

以下是循环:

#These variables are all specified because they need to change with different simulations

num.sims <- 20 
time <- 50
mat <- matrix(nrow = num.sims, ncol = time)
x <- 1000
init <- 0.5*x  
vec <- vector(length = x)
ratio <- 1 
freq <- -0.4 
freq.vec <- numeric(nrow(mat))

## start a loop
for (j in 1:num.sims) {

vec[1:init] <- 1; vec[(init+1):x] <- 2
year <- 2

freq.vec[j] <- sum(vec==1)/x


for (i in 1:(x*(time-1))) {

freq.1 <- sum(vec==1)/x; freq.2 <- 1 - freq.1
fit.ratio <- exp(freq*(freq.1-0.5) + log(ratio))
Pr.1 <- fit.ratio*freq.1/(fit.ratio*freq.1 + freq.2)
vec[ceiling(x*runif(1))] <- sample(c(1,2), 1, prob=c(Pr.1,1-Pr.1))

## record data    
if (i %% x == 0) {
  mat[j,year] <- sum(vec==1)/x
  year <- year + 1
}}}

根据你需要调用这个循环的频率,它可以在C++中重写。R是用C++构建的,任何C++都比效率高的R代码运行速度快很多倍。p>


sourceCpp是一个很好的开始包:

内部循环是使您减速的原因。要更新矩阵中的每个单元格,需要进行x次迭代。由于每次修改vec的过程都取决于上一次迭代,因此很难简化@Andrew Feierman可能正确,这将受益于移动到C++,至少在IF语句之前的四行。p> 或者,这只需要10-20秒即可运行。除非您打算将其放大或多次运行,否则可能不值得费心加快速度。如果您保持原样,您可以在Shiny中放置一个进度条,让用户知道事情仍在运行