假设您有以下函数foo
。当我正在运行for
循环时,我希望当foo
最初返回foo
的值时,它会跳过余下的0
。但是,break
在函数内部时不起作用。
正如目前所写,我收到一条错误消息no loop to break from, jumping to top level
。
有什么建议吗?
foo <- function(x) {
y <- x-2
if (y==0) {break} # how do I tell the for loop to skip this
z <- y + 100
z
}
for (i in 1:3) {
print(foo(i))
}
答案 0 :(得分:7)
不可否认,我的R知识很少,这是干编码的,但以下内容应该有效:
foo <- function(x) {
y <- x-2
if (y==0) {return(NULL)} # return NULL then check for it
z <- y + 100
z
}
for (i in 1:3) {
j <- foo(i)
if(is.null(j)) {break}
print(j)
}
编辑:为后代更新了空检查
答案 1 :(得分:4)
作为编码实践的问题,不要这样做。拥有一个只能在特定循环中使用的函数并不是一个好主意。作为教育兴趣,您可以评估父环境中的“休息”。
foo <- function(x) {
y <- x-2
if (y==0) {eval.parent(parse(text="break"),1)}
z <- y + 100
z
}
for (i in 0:3) {
print(foo(i))
}
答案 2 :(得分:4)
我们是否可以更有创意?您是否可以重新设计您的问题以利用以下方法,其中操作基于向量?
x <- 1:3
y <- x[x-2 < 0] - 2 + 100 # I'm leaving the "- 2" separate to highlight the parallel to your code
y
然而,如果更深层次的形式是问题的基础,我们现在需要遵循这种模式,或许稍微调整一下......
foo <- function(x) {
y <- x - 2
if (y != 0) {
z <- y + 100
z
} # else implicitly return value is NULL
}
for (i in 1:3) {
if (is.numeric(result <- foo(i))) {
print(result)
} else {
break
}
}
答案 3 :(得分:2)
另一种方法是抛出错误并用try
捕获它,如下所示:
foo <- function(x) {
y <- x-2
if (y==0) {stop("y==0")}
z <- y + 100
z
}
try(for (i in 0:5) {
print(foo(i))
}, silent=TRUE)
## or use tryCatch:
for (i in 0:5) {
bar <- tryCatch(foo(i),error=function(e) NA)
if(is.na(bar)){ break } else { print(bar) }
}
答案 4 :(得分:0)
我不知道r
是如何工作的,但我发现这个问题很有意思,因为我可以查找新语言的语法,如果完全错误,请原谅我的答案:)
foo <- function(x) {
y <- x-2
if (y!=0) z <- NULL else z <- y + 100
z
}
for (i in 1:3)
{
a <- foo(i)
if (a == NULL) {next}
print(a)
}