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

Chr*_*oph 5 debugging r conditional-statements

假设我有一个在 integer 上使用循环的函数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)
Run Code Online (Sandbox Code Playgroud)

解决方案

if (i == 5) { # inside loop of fun()
  browser()
}
Run Code Online (Sandbox Code Playgroud)

正在工作,但我认为可能有更好的东西(函数内没有额外的代码)

cle*_*ens 7

您可以使用参数exprbrowser()

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

browser()如果表达式的计算结果为 ,那么它只会打开被调用的环境TRUE

如果你想使用debug()

debug(fun, condition = i == 5)
Run Code Online (Sandbox Code Playgroud)

然后调用函数:

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

fun(x, y, n)
Run Code Online (Sandbox Code Playgroud)


Mar*_*gan 6

使用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)
}
Run Code Online (Sandbox Code Playgroud)

接下来,通过提供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]> 
Run Code Online (Sandbox Code Playgroud)