Мне нравится изменять исходный src таким образом, чтобы функция инициализации выглядела как определенные contructors. Я хотел бы изменить на следующий примерСправочные классы конструктора
Part.initialize<-function(...){
args<-list(...)
if(all(class(args[[1]])==c("XMLInternalElementNode", "XMLInternalNode", "XMLAbstractNode"))){
attr<-xmlAttrs(node)
.self$var1 <- if(is.na(attr["var1"])) vector() else attr["var1"]
.self$var2 <- if(is.na(attr["var2"])) character() else as.character(attr["var2"])
}else{
.self$var1 <- if(is.null(args[["var1"]])) vector() else args[["var1"]]
.self$var2 <- if(is.null(args[["var2"]])) character() else as.character(args[["var2"]])
}
.self
}
Part<-setRefClass(Class = "Part"
,fields = c(var1 = "ANY", var2 = "character")
,methods = list(initialize=Part.initialize))
txt = "<doc> <part var2=\"abc\"/> </doc>"
tree <- xmlTreeParse(txt, useInternalNodes = TRUE)
node<-xpathSApply(tree, "//part")[[1]]
part <- Part$new(node)
к чему-то вроде:
Part.initialize<-function(XMLNode){
do something
}
Part.initialize<-function(var1=c(),var2=character()){
do something
}
Помимо как обрабатывать значение по умолчанию для типа ЛЮБЫХ? До сих пор я использую vector().
Многие ТНХ, это излишним, чтобы объединить его с помощью метода инициализации в folowing пути к? ' generic.initialize <-функция (...) { args <- list (...); map <- .self $ getRefClass() $ fields(); map <- map [map! = "ANY"]; idx <- names (args)% in% names (map); args [idx] <- Map (as, args [idx], map [names (args) [idx]]); do.call (.self $ initFields, args); callSuper (...); } .Part <- setRefClass (Class = "Part", fields = c (var0 = "ANY", var1 = "numeric", var2 = "character"), methods = list (initialize = generic.initialize)) setMethod («Part», «XMLInternalNode», function (x, ...) { attr <-xmlAttrs (x); do.call (.Part, as.list (attr)); }) ' – Klaus
Проблема который поставляется вместе с этим оператором, заключается в том, что я не могу использовать функцию-член вызова (.self $ foo) в конструкторе. Как я могу справиться с этим? – Klaus
Как создать копию объекта? setMethod («Part», «Part», function (x, ...) {.Part (var1 = x $ var1, var2 = x $ var2, ...)}), или я должен использовать 'x $ copy() '? – Klaus