如何跳过并打破R中的循环

时间:2012-03-24 02:11:08

标签: r

我正在尝试编写一个生成模拟数据的函数,但如果模拟数据不符合条件,我需要跳过它,如果它符合条件,那么我将应用函数摘要。

我想循环它,直到找到10个有效数据集,然后停止。 (我实际上必须这样做,直到它达到10000)。这是代码。除了它之外的代码排序不会停止。我想我可能把下一个和破坏功能放在了错误的地方。我希望有人能帮助我一起写这篇文章。

我可以采用的另一种方法是先生成所有有效数据,然后将函数find_MLE(summary)应用到最终列表中。

编辑:我在内心重复。我编辑代码使其可重现。代码仍然会生成数据并且不会中断。

这是一个可重复的版本

      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)            

3 个答案:

答案 0 :(得分:1)

感谢您的帮助。我能够在不使用break函数的情况下编写函数!我在这里发布了以防其他人可能会发现它有用。

    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)) }

答案 1 :(得分:0)

由于您的代码不可复制,我无法完全测试和调试您的代码,但我认为这样看起来就像没有能够使用MLE函数复制一样。这大致是我如何设置它。但是在测试代码时,请查看文档/ Google中断,接下来,与R相关的/ 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

  }}

答案 2 :(得分: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