【问题标题】:Trouble with infinite for - repeat loop in RR中无限for-repeat循环的问题
【发布时间】:2013-12-05 19:28:49
【问题描述】:

我生成了一个无限循环,不知道如何修复它。

我基本上想通过数据框 rnumbers 并根据 rnumbers 中的内容生成带有 1、-1 或 0 的 rstate2

函数step_generator 卡在repeat 函数上。如果rnumber 小于C,我不确定如何将代码放在rstate2 中,然后为下一行重复ifelse 函数,直到获得D 或更大的值。获得 D 后,退出 repeat 函数并返回原始的 for 循环。

这是我的代码:

rnumbers <- data.frame(replicate(5,runif(20000, 0, 1)))
dt <- c(.01)
A <- .01
B <- .0025
C <- .0003
D <- .003
E <- .05


rstate <- rnumbers  # copy the structure
rstate[] <- NA      # preserve structure with NA's
# Init:
rstate[1, ] <- c(0)

step_generator <- function(col, rnum){
    for (i in 2:length(col) ){
            if( rnum[i] < C) {
                col[i] <- -1
                repeat {
                    ifelse(rnum[i] < E, -1, if(rnum[i] >= D) {break})
                }
            }
                       else { if (rnum[i] < B) {col[i] <- -1 }
                              else {ifelse(rnum[i] < A, 1, 0) } }
                        }
    return(col)
    }

#  Run for each column index:
for(cl in 1:5){ rstate[ , cl] <- 
                        step_generator(rstate[,cl], rnumbers[,cl]) }

感谢您的帮助。

【问题讨论】:

  • ifelse 不是编程控件。我猜问题发生在这里:ifelse(rnum[i] &lt; E, -1, if(rnum[i] &gt;= D) {break})。我没有查看您的代码逻辑,但可能会替换 if(cond){cons}else{alt}

标签: r for-loop infinite-loop repeat


【解决方案1】:

问题是你没有在repeat 循环内增加i,所以基本上你一直在测试相同的i,因为rnum[i] &lt; C(来自if 条件)它总是rnum[i] &lt; EC &lt; E 以来,循环永远不会中断。 然而,如果你在repeat 中增加i,它仍然会回到for 循环产生的值,所以你必须以不同的方式来做,例如使用while 循环。我不确定我是否理解你想要做什么,但根据你的描述,我已经做了这个功能:

step_generator <- function(col, rnum){
    i <- 2
    while (i <= length(col)){
        if (rnum[i] < C) {
            col[i] <- -1
            while ((i < length(col)) & (rnum[i + 1] < D)){
                i <- i + 1
                col[i] <- -1
            }
        } else if (rnum[i] < B){
            col[i] <- -1
        } else if (rnum[i] < A){
            col[i] <- 1
        } else {
            col [i] <- 0
        }
        i <- i + 1
        }
    return(col)
}

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2011-06-10
    • 2018-02-16
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多