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

Posted

技术标签:

【中文标题】仅在满足条件时如何启动调试器【英文标题】:How to start debugger only when condition is met 【发布时间】:2018-08-07 02:42:27 【问题描述】:

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

但现在我读到了 browserdebugconditiontext 参数:

text 浏览器启动时可以检索到的文本字符串 condition 浏览器可以检索到的条件 已输入。

是否可以按照我想要的方式使用参数?

这是一个例子。调试器/浏览器仅应在达到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()

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

【问题讨论】:

textcondition 不用于确定您何时进入调试模式(浏览器),而是用于提供信息一旦您进入 【参考方案1】:

您可以在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)

【讨论】:

你知道condition 参数是什么意思吗? 在文档的Details 部分中,它说“目的......[是] 允许帮助程序在此处插入特定值” 好的。有没有办法用debug()处理这种情况?【参考方案2】:

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

【讨论】:

以上是关于仅在满足条件时如何启动调试器的主要内容,如果未能解决你的问题,请参考以下文章

仅在满足条件时如何应用edgeIgnoringSafeArea?

如何编写查询以仅在满足条件时才显示值?

仅在满足另一个条件时如何按列过滤查询

仅在满足父模型的给定条件时如何获取模型关系

如何制作 Segue Pass 数据并且仅在满足某些条件时执行

如何加入 2 SELECT 语句,但仅在表 B 上满足表 A 的条件时显示输出