繁体   English   中英

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

[英]How to start debugger only when condition is met

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

但是现在我读到了browserdebugconditiontext参数:

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)
}

然后它将仅打开调用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)

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

所以

> 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]> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM