在R中的for循环中运行函数时,断开for循环

时间:2010-03-25 04:52:06

标签: r for-loop

假设您有以下函数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))
}

5 个答案:

答案 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)
}