2016-03-08 3 views
1

Есть ли способ импортировать файл .rda в качестве значения по умолчанию для слота S4 класса во время объявления прототипа по умолчанию?Загрузите файл .Rda в слот класса S4 R во время его построения

Предположим, у меня есть файл data/myRDAdata.rda в моем пакете R. Я хотел бы создать объект S4 R следующим образом:

bed_object <- setClass(
# name 
"bed_object", 

slots = c(chr= "character"), 

prototype = list(chr = c("chr1", "etc..")), #ADD HERE IMPORT FOR A .Rda file 

validity=function(object){ 
      return(TRUE) 
} 
) 

и иметь его нагрузить data(myRDAdata) в КПЧ во время объявления прототипа.

Спасибо всем, кто может помочь.

ответ

1

Вы должны сделать это, указав метод initialize для вашего класса, который читает файл по умолчанию. Используя этот класс в качестве примера,

bed_object <- setClass(
    "bed_object", 
    slots = c(data.file = "character", 
       data = "data.frame" 
    ), 

    prototype = list(
     ## system.file("data/default-data.Rdata", package = "mypackage") 
     data.file = "default-data.Rdata", 
     data = data.frame() 
    ), 

    validity = function(object) { 
     if (!file.exists("default-data.Rdata")) { 
      stop(sprintf("Could not find %s!", [email protected])) 
     } 

     tmp.env <- new.env() 
     .x <- try({ 
      suppressWarnings(load([email protected], envir = tmp.env)) 
     }, silent = TRUE) 

     if (inherits(.x, "try-error")) { 
      stop(sprintf("Could not read %s!", [email protected])) 
     } 

     TRUE 
    } 
) 

initialize метод может выглядеть следующим образом:

setMethod("initialize", "bed_object", function(.Object, ...) { 
    .Object <- callNextMethod() 
    if (validObject(.Object)) { 
     tmp.env <- new.env() 
     x <- load([email protected], envir = tmp.env) 

     [email protected] <- tmp.env[[x[1]]] 
     invisible(.Object) 
    } 
}) 

Testing это,

Df <- data.frame(x = 1:5, y = 6:10) 
save(Df, file = "default-data.Rdata") 

## default 
b1 <- new("bed_object") 
[email protected] 
# x y 
#1 1 6 
#2 2 7 
#3 3 8 
#4 4 9 
#5 5 10 

## invalid data file 
b2 <- new("bed_object", data.file = "xyz.Rdata") 
#Error in validityMethod(object) : Could not read xyz.Rdata! 

Пару замечаний:

  • Вы захотите заменить мой файл по умолчанию default-data.Rdata тем, что вы отправляете вместе с пакетом; что-то вроде system.file("data/default-data.Rdata", package = "mypackage")
  • validity метод не является необходимым, но это не помешает иметь либо
+1

Brilliant! Спасибо за помощь! –

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

  • Нет связанных вопросов^_^