问题
How to debug a call like getFields? I tried library(debug); mtrace(AB.setFields)
but nothing happend.
Besides there are some better ways to define 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:
You want to call the trace
method of the instance object.
a$trace("setFields")
This is the implementation that you want for the setFields
method.
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))
There's probably some syntactic sugar I've missed to make this prettier, but to get all your fields, you can use
AB.getFields <- function(){
mget(
names(.refClassDef@fieldClasses),
envir = attr(.self, ".xData")
)
}
来源:https://stackoverflow.com/questions/18639140/how-to-debug-methods-from-reference-classes