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 data
为 NA
,然后将 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
对象。
我正在使用 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 data
为 NA
,然后将 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
对象。