假设我的函数在整数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)
解决方案
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)
}
然后,如果表达式评估到 TRUE
,它将仅打开调用browser()
的环境。
如果要使用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())
so
> 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]>