【问题标题】:multiple next statements in function函数中的多个 next 语句
【发布时间】:2014-02-18 14:23:21
【问题描述】:

我正在尝试运行一个更复杂但等于:

 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 不能取值低于 0。如果 A 在表的行数为 10 之前达到 0,则整个过程必须重新开始,输入值与以前相同。

但是,此功能不起作用。我想是因为我使用了多个 next 语句,对吗?

谢谢!

【问题讨论】:

  • next 只适用于最里面的嵌套循环,你认为你需要 next 这里吗?
  • 返回 table 而不是使用 break。这是否符合您的预期?此外,没有缩进的代码很难遵循嵌套在哪里。这可能会帮助你遵循你的逻辑。
  • 避免使用 &lt;&lt;- 。它在这里没有任何帮助。
  • 在我添加评论的那一行中,无法遵循您打算使用的花括号和括号。此外 - 由于您拥有 if(nrow(table)==10),因此您的 else 没有其他状态,除了 not 10 行,因此无需再次检查该值。

标签: r function next


【解决方案1】:

我认为你在正确的轨道上......只是一些建议

我认为这可以实现您想要实现的更清洁的目标。我赞同 Carl 的建议,即尽可能避免使用全局运算符 '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

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多