我有一个复杂的条件(包括副作用)来决定是否在循环中继续下一步,所以我想提取函数中的逻辑。
CRAN检查返回以下警告:
Found the following significant warnings:
Note: break used in wrong context: no loop is visible
Note: next used in wrong context: no loop is visible
我已经尝试做一些类似下面的最小reprex中报告的事情,但它返回一个错误。
# comented code are not needed to reproduce the issue, they are
# just a sample of some compelxity I would like to extract from the
# cycle using `b`
b <- function() {
# cat("Doing something complex w/ side effect")
# complex_cond <- TRUE
# if (complex_cond) {
break
# } else {
# cat("Perform compelx cycle computation")
# }
}
res <- for (j in letters[1:2]) {
cat(j)
for (i in 1:2) {
cat(i, "\n")
b()
}
}
#> a1
#> Error in b(): no loop for break/next, jumping to top level
expected <- for (j in letters[1:2]) {
cat(j)
for (i in 1:2) {
cat(i, "\n")
break
}
}
#> a1
#> b1
res |> identical(expected)
#> Error in identical(res, expected): object 'res' not found
由reprex package(v2.0.1)于2022-08-29创建
不管它是否有用,也不管它是否是一个好的实践(当然不是!:-)),你知道是否有可能做到这一点,如果没有,为什么?
Thank you!
2条答案
按热度按时间y1aodyip1#
虽然不能从函数内部跳出循环,但可以使用
callCC
从内部函数内部的外部函数提前返回。请参见父环境中的R - evaluating return()以获取示例。然而,这里我们只关心用于调试目的的条件
break
,假设您控制代码,我认为定义一个逻辑选项来打开或关闭调试会更容易,如下所示。下面我们打开它或使用options(debug = NULL)
或options(debug = FALSE)
关闭它。hgqdbh6s2#
[Edit 20220901:此处报告的“解决方案”不起作用!]
感谢@g-grothendieck的英语改写,我找到了解决方案here。
我还是不明白为什么我不能直接这么做。总之:就是这样;在那里,你可以找到解决方案。
谢谢大家!