我正在处理一系列脚本并使用s3类和方法来保持一点清洁。
班级结构有三个层次。
我想编写一个只接受类stim_report数据帧的函数,然后调度一个不同的方法,具体取决于stim_report是继承自sample_report还是继承自fix_report。
显然,我可以做类似
的事情myfunction.stim_report(df)
if ("sample_report" %in% class(df)) {
% do something
} else if ("fix_report" %in% class(df)) {
% do something
}
但是这种方法违背了方法调度的目的。
请注意,我需要工作才能使函数在数据框的类不是exc_report的情况下返回错误。所以我想我也可以这样做:
myfunction.fix_report(df)
if ("stim_report" %in% class(df)) {
% do something
} else {
stop("No method found")
}
myfunction.sample_report(df)
if ("stim_report" %in% class(df)) {
% do something
} else {
stop("No method found")
}
但同样,这感觉它违背了S3方法的全部要点。
有没有正确的方法呢?
答案 0 :(得分:1)
这样的事情怎么样 -
Df1 <- data.frame(
x = 1:5,
y = rexp(5))
##
Df2 <- data.frame(
x = 6:10,
y = rexp(5))
##
Df3 <- data.frame(
x = 11:15,
y = rexp(5))
##
class(Df1) <- c("stim_report","sample_report","data.frame")
class(Df2) <- c("stim_report","fix_report", "data.frame")
##
foo <- function(x){
UseMethod("foo",x)
}
foo.sample_report <- function(x){
x[sample(1:nrow(x),3),]
}
foo.fix_report <- function(x){
x[,2] <- cumsum(x[,2])
x
}
##
> foo(Df1)
x y
3 3 0.9400994
5 5 0.3708902
1 1 0.7521028
> foo(Df2)
x y
1 6 2.408421
2 7 2.637971
3 8 3.465672
4 9 3.571835
5 10 5.468710
> foo(Df3)
Error in UseMethod("foo", x) :
no applicable method for 'foo' applied to an object of class "data.frame"
您可以在哪里更改foo.sample_report
和foo.fix_report
的正文,以执行您希望他们执行的操作。对象&#39;类被分配为c("stim_report","sub_class", "data.frame")
而不仅仅是c("stim_report","sub_class")
,以便他们可以继承其他S3泛型,例如nrow
。