创建一个 S4 class 继承自数据框
Create an S4 class inheriting from a data frame
我正在写一个 R 包。在这个包中,我希望有一种特殊类型的数据框,一些函数可以识别它,具有一些额外的属性,但在其他方面表现得与数据框完全一样。实现我想要的一种方法是在常规数据框上设置一些属性:
makedf <- function() {
df <- data.frame(ID=1:3)
attr(df, "myDF") <- TRUE
attr(df, "source") <- "my nose"
return(df)
}
dosmth <- function(df) {
if(!is.null(attr(df, "myDF"))) message(sprintf("Oh my! My DF! From %s!", attr(df, "source")))
message(sprintf("num of rows: %d", nrow(df)))
}
当dosmth()
收到一个"myDF"时,它有关于数据帧来源的附加信息:
dosmth(data.frame(1:5))
#> num of rows: 5
dosmth(makedf())
#> Oh my! My DF! From my nose!
#> num of rows: 3
同样,使用 S3 会相当简单,我们甚至可以利用方法分派编写 dosmth 的不同变体。我如何使用 S4 做到这一点?
我不完全确定这是否是您要查找的内容,但听起来您似乎希望能够定义一个专门用于 MyDF
和 [=13= 的通用函数], 就像这样 reprex
MyDF <- setClass(Class = "MyDF",
slots = c(source = "character"),
contains = c("data.frame"))
setGeneric("dosmth", function(x) message("Can only dosmth to a df or MyDF"))
setMethod("dosmth", signature("data.frame"),
function(x) message(sprintf("num of rows: %d", nrow(x))))
setMethod("dosmth", signature("MyDF"),
function(x) message(sprintf("Oh my! My DF! From %s!", x@source)))
a_df <- data.frame(a = 1, b = 2)
a_MyDF <- MyDF(a_df, source = "my nose")
dosmth("my nose")
#> Can only dosmth to a df or MyDF
dosmth(a_df)
#> num of rows: 1
dosmth(a_MyDF)
#> Oh my! My DF! From my nose!
感谢@JDL 的评论指出我们不需要额外的"data.frame"槽,这样data.frame行为就可以正确继承,如下例所示:
a_MyDF[1,]
#> a b
#> 1 1 2
由 reprex package (v0.3.0)
于 2020-04-17 创建
我正在写一个 R 包。在这个包中,我希望有一种特殊类型的数据框,一些函数可以识别它,具有一些额外的属性,但在其他方面表现得与数据框完全一样。实现我想要的一种方法是在常规数据框上设置一些属性:
makedf <- function() {
df <- data.frame(ID=1:3)
attr(df, "myDF") <- TRUE
attr(df, "source") <- "my nose"
return(df)
}
dosmth <- function(df) {
if(!is.null(attr(df, "myDF"))) message(sprintf("Oh my! My DF! From %s!", attr(df, "source")))
message(sprintf("num of rows: %d", nrow(df)))
}
当dosmth()
收到一个"myDF"时,它有关于数据帧来源的附加信息:
dosmth(data.frame(1:5))
#> num of rows: 5
dosmth(makedf())
#> Oh my! My DF! From my nose!
#> num of rows: 3
同样,使用 S3 会相当简单,我们甚至可以利用方法分派编写 dosmth 的不同变体。我如何使用 S4 做到这一点?
我不完全确定这是否是您要查找的内容,但听起来您似乎希望能够定义一个专门用于 MyDF
和 [=13= 的通用函数], 就像这样 reprex
MyDF <- setClass(Class = "MyDF",
slots = c(source = "character"),
contains = c("data.frame"))
setGeneric("dosmth", function(x) message("Can only dosmth to a df or MyDF"))
setMethod("dosmth", signature("data.frame"),
function(x) message(sprintf("num of rows: %d", nrow(x))))
setMethod("dosmth", signature("MyDF"),
function(x) message(sprintf("Oh my! My DF! From %s!", x@source)))
a_df <- data.frame(a = 1, b = 2)
a_MyDF <- MyDF(a_df, source = "my nose")
dosmth("my nose")
#> Can only dosmth to a df or MyDF
dosmth(a_df)
#> num of rows: 1
dosmth(a_MyDF)
#> Oh my! My DF! From my nose!
感谢@JDL 的评论指出我们不需要额外的"data.frame"槽,这样data.frame行为就可以正确继承,如下例所示:
a_MyDF[1,]
#> a b
#> 1 1 2
由 reprex package (v0.3.0)
于 2020-04-17 创建