我正在尝试运行一个更复杂但功能相同的函数:
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,则整个过程必须重新开始,具有与之前相同的输入值。
但是,此功能不起作用。我认为这是因为我使用了多个下一个语句,这是正确的吗?
谢谢!
答案 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