我正在尝试通过调用子类来调试 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
进入调试浏览器后即可输入与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)
完成后,您需要记住将其取出,但这避免了每次调用子级时都需要要求浏览器调试父级。