lapply 函数的等价物 "break"

Equivalent "break" for the lapply function

我正在尝试创建一个有条件终止的函数。让这个条件为“if (i == 5)

le <- letters
for(i in seq_along(let)){
   ## some code
  print(le[i])
  if(i==5) break
}

for一切顺利

[1] "a"
[1] "b"
[1] "c"
[1] "d"
[1] "e"

但是当我使用 lapply 时出现错误

fu <- function(i){
  ## some code
  print(le[i])
  if(i==5) break
} 
lapply(1:length(le) , fu)

资源

[1] "a"
[1] "b"
[1] "c"
[1] "d"
[1] "e"
Error in FUN(X[[i]], ...) : no loop for break/next, jumping to top level
Called from: FUN(X[[i]], ...)

我该如何解决?

您无法修复它,也没有任何简单的解决方法。 lapply() 不支持 break。如果你想中断,你需要使用不同类型的循环。

这是一种解决方法:

le <- letters

fu <- local({
  broken <- FALSE
  function(i){
    if (broken) return()
    ## some code
    print(le[i])
    if(i==5) broken <<- TRUE
  }
})

res <- lapply(1:length(le) , fu)
#> [1] "a"
#> [1] "b"
#> [1] "c"
#> [1] "d"
#> [1] "e"

reprex package (v2.0.0)

于 2021-09-05 创建

如果您查看 res,您会发现它包含 21 个 NULL,因为它仍然被调用了 26 次。如果不在 lapply() 内部变量中乱搞非常危险,你就无法阻止它。