如何跳过和中断R中的循环

问题描述 投票:-2回答:3

我正在尝试编写一个生成模拟数据的函数,但是如果模拟数据不满足条件,则需要跳过它,并且如果确实满足条件,那么我将应用函数摘要。

我想循环播放,直到找到10个有效数据集,然后停止。 (实际上,我必须这样做直到达到10000)。这是代码。代码工作不会停止,除了它之外。我想我可能将next和break函数放置在错误的位置。我希望有人可以帮我一起写这个。

我可以采用的另一种方法是先生成所有有效数据,然后将功能find_MLE(摘要)应用于最终列表。

编辑:我把休息放在重复里面。我编辑代码以使其可重现。代码仍然不断生成数据,并且不会中断。

这里是可复制的版本

      validData <-  function(GM, GSD,sampleSize, p) {

            count=0
            for (i in 1:n) {  
              repeat {
                lod <- quantile(rlnorm(1000000, log(GM), log(GSD)), p = p)
                X_before <- rlnorm(sampleSize, log(GM), log(GSD))
                Xs <-  ifelse(X_before <= lod, lod,  X_before)
                delta <- ifelse(X_before <= lod, 1,  0) 
                pct_cens <- sum(delta)/length(delta)
                print(pct_cens)
                if (pct_cens == 0 & pct_cens ==1) next

                else {

                  sumStats <- summary(Xs)

                  Med <- sumStats[3]
                  Ave <- sumStats[4]

                      }

                  count<- count+1

                if (count == 10) break
              }}
            return(c(pct_cens, Med, Ave))
          }



          validData(GM=1,GSD=2,sampleSize=10,p=0.1)            
r
3个回答
1
投票
感谢您的帮助。我无需使用中断功能就可以编写函数!我在这里发布了它,以防其他人发现它有用。

dset <- function (GM, GSD, n, p) { Mean <- array() Median <- array() count = 0 while(count < 10) { lod <- quantile(rlnorm(1000000, log(GM), log(GSD)), p = p) X_before <- rlnorm(n, log(GM), log(GSD)) Xs <- ifelse(X_before <= lod, lod, X_before) delta <- ifelse(X_before <= lod, 1, 0) pct_cens <- sum(delta)/length(delta) print(pct_cens) if (pct_cens == 0 | pct_cens == 1 ) next else {count <- count +1 if (pct_cens > 0 & pct_cens < 1) { sumStats <- summary(Xs) Median[count] <- sumStats[3] Mean [count]<- sumStats[4] print(list(pct_cens=pct_cens,Xs=Xs, delta=delta, Median=Median,Mean=Mean)) } } } return(data.frame( Mean=Mean, Median=Median)) }


0
投票
由于您的代码不可复制,因此我无法完全测试和调试您的代码,但是我认为这是无法通过MLE函数进行复制的样子。这大致就是我要设置的方式。但是在测试代码时,请查看与R相关的文档/ Google休息,for / while循环。

validData <- function(GM, GSD,Size, p) { for (i in 1:20) { count <- 1 repeat { lod <- quantile(rlnorm(1000000, log(GM), log(GSD)), p = p) X_before <- rlnorm(Size, log(GM), log(GSD)) Xs <- ifelse(X_before <= lod, lod, X_before) delta <- ifelse(X_before <= lod, 1, 0) pct_cens <- sum(delta)/length(delta) if (pct_cens == 0 & pct_cens ==1) function() #your foo goes here else { mles <- find_MLE(c(0,0), Xs, delta) GM_est <- mles[1] GSD_est <- mles[2] AM_est <- exp(log(GM_est) + 1 ) SD_est<- sqrt((AM_est)^2*exp(log(GSD_est)^2)) D95th_est <- GM_est*(GSD_est^1.645) } } return(c(GM_est,GSD_est,AM_est,SD_est,D95th_est)) count<- count+1 if (count == 10) break }}


0
投票
要根据条件跳到外循环,只需使用break()

这是一个简单的示例,其中内部循环将尝试运行10次,但通常会遇到阻止它运行的条件]

# OUTER LOOP for(i in 1:2) { print(paste("Outer loop iteration", i)) # INNER LOOP (will run max 10 times) for(j in 1:10) { print(paste("Inner loop iteration", j)) if (runif(1) > 0.4) { # Randomly break the inner loop print(paste("Breaking inner loop", j)) break() } } }

如果要跳到外循环

发生错误(而不是基于条件时),请参阅here] >>

© www.soinside.com 2019 - 2024. All rights reserved.