2013-09-10 3 views
0

Каков правильный способ определения функции, которая возвращает произвольное количество полей.Возвращает список полей ссылочного класса

A.getFields<-function(values){ 
    vars<-getRefClass()$fields() 
    idx<-names(vars) %in% values 
    if(length(fields)<1) 
    return(vars) 
    return(vars[idx]) 
} 
A.setFields<-function(...){ 
    dots <- list(...) 
    fieldNames <- names(dots) 
    for(i in seq_along(dots)) 
    assign(fieldNames[[i]], dots[[i]], attr(.self, ".xData")) 
} 
A<-setRefClass(Class = "A", 
       fields = c(var1 = "list", 
          var2="character"), 
       methods = list(getFields=A.getFields 
           ,setFields=A.setFields 
           ,initialize=function(...,var1=list(), var2=character()) { 
           obj<-list(...)[[1]] 
           if(is(obj,"list")) 
            do.call(.self$setFields,obj) 
           else{ 
            .self$var1<-as.list(var1) 
            .self$var2<-as.character(var2) 
           } 
           .self 
           }) 
) 

a<-A(var1=list(1:3),var2="A") 
a$getFields(c("var2")) 
a$getFields(c("var2","var1")) 

ответ

1

Определение ссылки класса может быть запрошен для определенных полей, например,

getRefClass("A")$fields() 
a = A() 
a$getRefClass()$fields() 

так возможно

A = setRefClass("A", fields=c(var1="list", var2="character"), 
    methods=list(getFields=function(values) { 
     flds = names(getRefClass()$fields()) 
     if (!missing(values)) 
      flds = flds[flds %in% values] 
     result = setNames(vector("list", length(flds)), flds) 
     for (fld in flds) 
      result[[fld]] = .self[[fld]] 
     result 
    })) 

с

> A(var2=letters[1:5])$getFields("var2") 
$var2 
[1] "a" "b" "c" "d" "e" 
+0

Многих ТНХАМИ, есть общий differnt для следующей функции для getFields? 'A.getFields <-функция (значения) { варов <-getRefClass() $ поле() IDX <-names (вары)% в% значениях , если (длина (поля) <1) возврата (вары) return (vars [idx]) } ' – Klaus

+0

@Klaus Код не работает как написанный, но, похоже, возвращает типы полей, а не их значения. –

+0

Вы правы' A.getFields <-функция (значения) { vars <-mget (names (.refClassDef @ fieldClasses), envir = attr (.self, ".xData")) if (missing (values)), sry Я прочитал это сообщение до конца. return (vars) return (vars [names (vars)% in% values]) } 'это то, что я предложил, это функция от [здесь] (http://stackoverflow.com/questions/18639140/how -в-отладочные-методы-из-референс-классов? noredirect = 1 # comment27442400_18639140) – Klaus

Смежные вопросы