在构建过程中将 .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
方法不是必需的,但两者都没有坏处
有什么方法可以在默认原型声明期间导入 .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
方法不是必需的,但两者都没有坏处