R:如果输出为 NA,则重复复制

R: repeate replicate if output is NA

我正在使用 R 中的 diffeqr 求解数值随机微分方程,检查最后一个值是否足够大并将该过程重复 5 次。这部分的代码是:

for(i in 1:30){
  for(j in 1:15) {
    u0<-c(1.5e+6+i*5e+4,j*2e+5)
    data<-replicate(n=5,{
      prob <- de$SDEProblem(f,g,u0,tspan,p)
      fastprob<-diffeqr::jitoptimize_sde(de,prob)
      sol <- de$solve(fastprob,saveat=0.005)
      mat <- sapply(sol$u,identity)
      udf <- as.data.frame(t(mat))
      udf[40000,1]<1e+6}
    )
    sum(data)/length(data)
    res02_4[i,j]=sum(data)/length(data)
  }
}

但是,有时出于某种原因,结果中的某些结果是 NA,因此 sum(data)/length(data) 也是 NA。在这种情况下,我想重做整个 replicate 片段(直到它不是 NA)。我该如何组织呢?首先想到的是 if() {} else {} 的组合,但我认为这将是相当麻烦的构造 - 有没有更优雅的方式?

您可以 pre-define dataNA,然后将 replicate 部分包装在 while 循环中运行一次或多次,直到 sum(data) 不是 NA

for(i in 1:30){
  for(j in 1:15) {
    u0<-c(1.5e+6+i*5e+4,j*2e+5)
    data <- NA
    while(is.na(sum(data))) {
      data <- replicate(n = 5,{
        prob <- de$SDEProblem(f,g,u0,tspan,p)
        fastprob<-diffeqr::jitoptimize_sde(de,prob)
        sol <- de$solve(fastprob,saveat=0.005)
        mat <- sapply(sol$u,identity)
        udf <- as.data.frame(t(mat))
        udf[40000,1]<1e+6}
      )
    }
    sum(data)/length(data)
    res02_4[i,j]=sum(data)/length(data)
  }
}

显然,我无法证明这有效,因为您没有在问题中包含 de 对象。