3

如何调试像 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()
4

1 回答 1

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")
  )
}
于 2013-09-05T15:34:05.370 回答