如何从Reference Classes调试方法?

时间:2013-09-05 14:32:51

标签: r reference-class

如何调试像getFields这样的调用?我试过library(debug); mtrace(AB.setFields)但没有发生任何事情。

除了有一些更好的方法来定义AB.setFields?

AB.getFields<-function(){
  return(list(name,var2))
}
AB.setFields<-function(fields){
  namevar<-names(fields)
  for(i in 1:length(fields)) do.call("<<-",list(namevar[i],fields[[i]]))
}
AB <- setRefClass("AB", fields=c(name="character",
                                 var2="factor"),
                        methods=list(getFields=AB.getFields
                                    ,setFields=AB.setFields)
                  )
a<-AB(name="abc",var2=factor(LETTERS[1:3]))
a$getFields()
fields<-list(name="aaa",var2=factor(1:3))
a$setFields(fields)
a$getFields()

1 个答案:

答案 0 :(得分:3)

您想要调用实例对象的trace方法。

a$trace("setFields")

这是setFields方法所需的实现。

AB.setFields <- function(...) {
  dots <- list(...)
  fieldNames <- names(dots)
  for(i in seq_along(dots)) 
  {
    assign(fieldNames[[i]], dots[[i]], attr(.self, ".xData"))
  }
}

a$setFields(name="aaa",var2=factor(1:3))

可能有一些语法糖我错过了这个更漂亮,但为了得到你所有的领域,你可以使用

AB.getFields <- function(){
  mget(
    names(.refClassDef@fieldClasses), 
    envir = attr(.self, ".xData")
  )
}