在构建过程中将 .Rda 文件加载到 S4 R Class 的插槽中

load .Rda file into a slot of a S4 R Class during its construction

有什么方法可以在默认原型声明期间导入 .rda 文件作为 S4 Class 插槽的默认值?

假设我的 R 包中有一个 data/myRDAdata.rda 文件。我想按如下方式创建一个 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)
 }
)

并让它在原型声明期间在 chr 中加载 data(myRDAdata)

感谢任何可以提供帮助的人。

您应该能够通过为您的 class 定义一个 initialize 方法来做到这一点,该方法读取默认文件。以此 class 为例,

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!", object@data.file))
        }

        tmp.env <- new.env()
        .x <- try({
            suppressWarnings(load(object@data.file, envir = tmp.env))
        }, silent = TRUE)

        if (inherits(.x, "try-error")) {
            stop(sprintf("Could not read %s!", object@data.file))
        }

        TRUE
    }
)

initialize 方法可能如下所示:

setMethod("initialize", "bed_object", function(.Object, ...) {
    .Object <- callNextMethod()
    if (validObject(.Object)) {
        tmp.env <- new.env()
        x <- load(.Object@data.file, envir = tmp.env)

        .Object@data <- 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")
b1@data
#  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 方法不是必需的,但两者都没有坏处