2013-09-05 40 views
1

如何調試像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() 
+0

難道你要使用「 「。以一種不受R語法約定支持的方式? –

回答

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([email protected]), 
    envir = attr(.self, ".xData") 
) 
} 
+0

Thx,是否也可以從環境'attr(.self,「.xData」)'一次調用所有成員變量?或者是正確的做法'AB.getFields <-function(){return(list(name = name,var2 = var2)) }'? – Klaus

+0

嗨,你可以請再次幫忙,我試圖找出如何跟蹤跟蹤初始化函數,如果我實例化一個新對象像AB $新(...)。我試過AB $ trace(「初始化」),但它不起作用。 – Klaus

+0

@Klaus:你需要明確定義一個'initialize'方法,然後才能追蹤它。 –

相關問題