Chr*_*oph 5 debugging r conditional-statements
假设我有一个在 integer 上使用循环的函数i。现在出了点问题,我假设错误发生在i=5. 现在我可以逐步完成每一步(到目前为止我所做的)。
但现在我看了一下condition和text论证browser和debug:
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)
正在工作,但我认为可能有更好的东西(函数内没有额外的代码)
您可以使用参数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)
}
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)
使用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)