R语言 使class()的函数更灵活

tvz2xvvm  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(123)

我有这个函数称为花花公子。它需要数据作为一个必需的NanoStringGeoMxSet类,与规范是“负”输入。我想通过一个标志/错误的用户,如果类是不正确的。但是,数据=(可以是任何标记的输入)。我想允许类在这方面采取任何变量来检查类的状态。任何想法?

Dude <- function(Data, Norm) {
  
  if(class(data)[1] != "NanoStringGeoMxSet"){
    stop(paste0("Error: You have the wrong data class, must be NanoStringGeoMxSet" ))
  }

  ## rest of code
}

Dude(Data = data, Norm = "neg")
c9qzyr3d

c9qzyr3d1#

要开始讨论S3实施,请从以下开始:

Dude <- function(Data, Norm) UseMethod("Dude")
Dude.NanoStringGeoMxSet <- function(Data, Norm) {
  ## rest of code
}

Dude(mtcars)
# Error in UseMethod("Dude") : 
#   no applicable method for 'Dude' applied to an object of class "data.frame"

如果您想自定义错误消息,或者根据其他条件进行恢复,则可以定义一个“默认”方法沿着上述两个方法:

Dude.default <- function(Data, Norm) {
  stop(paste("unrecognized class:",
       paste(sQuote(class(Data), FALSE), collapse = ", ")))
}

Dude(mtcars)
# Error in Dude.default(mtcars) : unrecognized class: 'data.frame'

顺便说一句,如果你也想基于第二个(可能是后续的)参数进行调度,你可能想考虑R6而不是S3。它的实现要比S3复杂得多,但是它更好地实现了面向对象和多参数调度,并添加了公共/私有成员/属性(以及其他区别)。如果你感兴趣,请参阅https://r6.r-lib.org

相关问题