调试父类构造函数

问题描述 投票:0回答:1

我正在尝试通过调用子类来调试 R6 父类的构造函数。

这是代码

library(R6)
parent <- R6Class(
  "parent",
  public=list(
    y=data.table(),
    initialize=function(){
      cat("hello","\n")
      self$y <- data.table(a=rep(1,5),b=rep("a",5))
      for(i in 1:5){
        cat("bla \n")
      }
    }
  )
)
child <- R6Class(
  "child",
  inherit=parent,
  public=list(
    initialize=function(){
      super$initialize();
    }
  )
)
parent$debug("initialize")
child$debug("initialize")
x <- child$new() ##debugging of parent consturctor doesn't work
y <- parent$new() ##debugging of parent consturctor works

到目前为止,在构造子构造函数时,调试器不会遍历父构造函数。执行父构造函数代码就像关闭调试一样。

知道如何在不直接调用父级的情况下单步执行父级构造函数代码吗?

R版本:4.3.2 R6版本:2.5.1 操作系统:Linux,内核6.7 R环境:emacs ess

r debugging constructor parent r6
1个回答
0
投票

进入调试浏览器后即可输入与parent相关的调试指令。因此,请调用

child$new()
,然后在浏览器中按 Enter 之前:

Browse[2]> debug(super$initialize)

您会发现这可以让您进入下一个级别,

Browse[3]

debug at #6: super$initialize()
Browse[2]>
debugging in: super$initialize()
debug at #5: {
    cat("hello", "\n")
    self$y <- data.table(a = rep(1, 5), b = rep("a", 5))
    for (i in 1:5) {
        cat("bla \n")
    }
}
Browse[3]>

如果您要进行大量调试并且不想每次都输入此内容,您可以修改子类的

initialize()
函数以包含
debug_parent
标志:

child <- R6Class(
    "child",
    inherit = parent,
    public = list(
        initialize = function(debug_parent = FALSE) {
            if (debug_parent) debug(super$initialize)
            super$initialize()
        }
    )
)

然后您可以这样称呼它:

x <- child$new(debug_parent = TRUE) 

完成后,您需要记住将其取出,但这避免了每次调用子级时都需要要求浏览器调试父级。

© www.soinside.com 2019 - 2024. All rights reserved.