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()
内部变量中乱搞非常危险,你就无法阻止它。
我正在尝试创建一个有条件终止的函数。让这个条件为“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()
内部变量中乱搞非常危险,你就无法阻止它。