将break/next语句放入R中的函数中

p5cysglq  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(110)

我有一个复杂的条件(包括副作用)来决定是否在循环中继续下一步,所以我想提取函数中的逻辑。
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!

y1aodyip

y1aodyip1#

虽然不能从函数内部跳出循环,但可以使用callCC从内部函数内部的外部函数提前返回。请参见父环境中的R - evaluating return()以获取示例。
然而,这里我们只关心用于调试目的的条件break,假设您控制代码,我认为定义一个逻辑选项来打开或关闭调试会更容易,如下所示。下面我们打开它或使用options(debug = NULL)options(debug = FALSE)关闭它。

options(debug = TRUE)

  for (j in letters[1:2]) {
    cat(j)
    for (i in 1:2) {
      cat(i, "\n")
      if (getOption("debug", FALSE)) break
    }
  }
hgqdbh6s

hgqdbh6s2#

[Edit 20220901:此处报告的“解决方案”不起作用!]
感谢@g-grothendieck的英语改写,我找到了解决方案here
我还是不明白为什么我不能直接这么做。总之:就是这样;在那里,你可以找到解决方案。
谢谢大家!

相关问题