R中无限for-repeat循环的问题

R中无限for-repeat循环的问题,r,for-loop,infinite-loop,repeat,R,For Loop,Infinite Loop,Repeat,我生成了一个无限循环,不知道如何修复它 我基本上希望遍历数据帧rnumbers并根据rnumbers中的内容生成带有1、-1或0的rstate2 功能step\u生成器卡在repeat功能上。如果rnumber小于C,我不知道如何使rstate2中的代码put-1小于C,然后对下一行重复ifelse函数,直到获得D或更大的值。获得D后,退出repeat功能并返回原始for循环 这是我的密码: rnumbers <- data.frame(replicate(5,runif(20000, 0

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

我基本上希望遍历数据帧
rnumbers
并根据
rnumbers
中的内容生成带有1、-1或0的
rstate2

功能
step\u生成器
卡在
repeat
功能上。如果
rnumber
小于C,我不知道如何使
rstate2中的代码put-1小于C,然后对下一行重复
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]) }

rnumbers问题在于,在
重复
循环中,你没有增加
i
,因此基本上你一直在测试相同的
i
,因为
rnum[i]
(从
如果
条件)它将始终是
rnum[i]
,因为
C
,循环从未中断。 但是,如果在
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)
}

step\u生成器
ifelse
不是编程控件。我猜问题出现在这里:
ifelse(rnum[I]=D){break})
。我没有看过你的代码的逻辑,但可能会用
if(cond){cons}else{alt}