假设我有一个使用整数i
的循环的函数。现在出了问题,我认为错误发生在i=5
。现在我可以逐步完成每一步(我到目前为止所做的)。
但现在我读到了condition
和text
的{{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)
正在运行,但我可能会有更好的东西(函数内没有额外的代码)
答案 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())