2016-03-08 34 views
1

在默認原型的聲明期間,有什麼方法可以導入.rda文件作爲S4類槽的默認值?在構建期間將.Rda文件加載到S4 R類的槽中

比方說,我的R包中有一個data/myRDAdata.rda文件。我想如下創建一個S4ř對象:

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) 
} 
) 

,並讓它在CHR原型聲明過程中加載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) 
    } 
}) 

測試了這一點,

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

輝煌!感謝您的幫助! –