如何仅在满足条件时启动调试器

时间:2018-02-27 12:37:01

标签: r debugging conditional-statements

假设我有一个使用整数i的循环的函数。现在出了问题,我认为错误发生在i=5。现在我可以逐步完成每一步(我到目前为止所做的)。

但现在我读到了conditiontext的{​​{1}}和browser参数:

  

text 可在浏览器访问时检索的文本字符串   进入。
  条件在浏览器中可以检索的条件   进入了。

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

这是一个例子。调试器/浏览器只应在达到debug后启动:

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)

正在运行,但我可能会有更好的东西(函数内没有额外的代码)

2 个答案:

答案 0 :(得分:3)

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

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

如果表达式的计算结果为browser(),它将只打开调用TRUE的环境。

如果您想使用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)

答案 1 :(得分:3)

使用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())