函数中的多个下一个语句

时间:2014-02-18 14:23:22

标签: r function next

我正在尝试运行一个更复杂但功能相同的函数:

 A <<- 5
 B <<- 5

table <- data.frame(A,B)
backup <- table

test <- function(A,B){
 while(A > 0){
    r <- runif(1,0,1)
    if ((r >= 0)&(r <= 0.5)){
        A <- A + 1
        B <- B - 1
    } else if ((r > 0.5)&(r<=1)){
          A <- A - 1
          B <- B + 1
          }

 tab <- cbind(A,B)
 table <<- rbind(table,tab)

 if (nrow(table) == 10) {
     break
     } else  if ((A > 0) & (nrow(table) != 10)) {
          next
     } else {if ((A == 0) & (nrow(table != 10)) {   #pointing to error here?
         A <- 5
          B <- 5
        table <- backup
       next
    }
}
}

所以我希望这个函数做的是当表的行数(=函数运行的次数)等于某个值时停止,在这种情况下为10.但是A不能取值如果A在表的行数为10之前达到0,则整个过程必须重新开始,具有与之前相同的输入值。

但是,此功能不起作用。我认为这是因为我使用了多个下一个语句,这是正确的吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你走的正确......只是一些建议

我认为这可以实现你想要的更清洁。我强调了卡尔关于在可能的情况下避免全局运算符'&lt;&lt; - '并将对象作为参数或参数传递给函数的建议。我也是第二个Justin的建议,即避免使用break命令,以便巧妙地放置return()调用。为了实现这一点,我将你的10(停止标准)直接放入while循环中。我将其作为参数n包含在内,以便您可以尝试不同的停止条件。希望这会有所帮助:)

test <- function(A,B,n){
  A0 <- A
  B0 <- B
  tab <- data.frame(A,B)
  while(A > 0 & nrow(tab) < n){
    r <- runif(1,0,1)
    if (r <= 0.5){
      A <- A + 1
      B <- B - 1
    } else {
      A <- A - 1
      B <- B + 1
    }

    tab1 <- cbind(A,B)
    tab <- rbind(tab,tab1)

    if(nrow(tab)<n & A==0){
      A<-5
      B<-5
      tab <- cbind(A0,B0)
      names(tab) <- c('A', 'B')
      print(paste('found A==0 in less than ', n, ' iterations', sep=''))
    } 
  }
  return(tab)
}

测试功能......

## running function
A <- 5
B <- 5
testDF <- test(A,B,10)

> testDF 
    A B
1   5 5
2   6 4
3   5 5
4   6 4
5   7 3
6   8 2
7   9 1
8  10 0
9   9 1
10 10 0