R-仅在满足条件时才启动调试器



假设我的函数在整数i上使用循环。现在出现问题,我认为当i=5时发生错误。现在,我可以逐步完成每个步骤(我现在所做的(。

,但现在我读到了conditiontext browserdebug的参数:

text 浏览器为时可以检索的文本字符串 输入。
条件浏览器时可以检索的条件 输入。

是否可以按照我想要的方式使用参数?

这是一个示例。调试器/浏览器应仅在达到i=5之后开始:

fun <- function(x, y, n) {
  result <- 0
  for (i in 1:n) {
    # browser(condition = (i == 5)) # does not work
    result <- result + i * ( x + y)
  }
  return(result)
}
x <- 2
y <- 3
n <- 10
# debug(fun, condition = (i == 5)) # does not work
debug(fun)
r <- fun(x, y, n)
print(r)

解决方案

if (i == 5) { # inside loop of fun()
  browser()
}

正在工作,但是我很想有更好的东西(功能中没有额外的代码(

您可以使用browser()中的参数expr

fun <- function(x, y, n) {
  result <- 0
  for (i in 1:n) {
    browser(expr = {i == 5})
    result <- result + i * ( x + y)
  }
  return(result)
}

然后,如果表达式评估到 TRUE,它将仅打开调用browser()的环境。

如果要使用debug()

debug(fun, condition = i == 5)

然后调用函数:

fun <- function(x, y, n) {
  result <- 0
  for (i in 1:n) {
    result <- result + i * ( x + y)
  }
  return(result)
}
fun(x, y, n)

使用trace()的高级功能。

首先,按照参数at =的帮助页说明确定您的功能行,导致at = list(c(3, 4))

> as.list(body(fun))
[[1]]
`{`
[[2]]
result <- 0
[[3]]
for (i in 1:n) {
    result <- result + i * (x + y)
}
[[4]]
return(result)
> as.list(body(fun)[[3]])
[[1]]
`for`
[[2]]
i
[[3]]
1:n
[[4]]
{
    result <- result + i * (x + y)
}

接下来,通过提供tracer=参数来指定有条件的断点,当满足特定条件时调用浏览器的未评估表达式,tracer = quote(if (i == 3) browser())

so

> trace(fun, tracer = quote(if (i == 3) browser()), at=list(c(3, 4)), print=FALSE)
[1] "fun"
> r <- fun(x, y, n)
Called from: eval(expr, p)
Browse[1]> 
debug: {
    result <- result + i * (x + y)
}
Browse[2]>  i
[1] 3
Browse[2]> result
[1] 15
Browse[2]> 

最新更新