如何在R中为s4对象定义动态构造函数

时间:2015-05-02 09:25:39

标签: r s4

是否可以在R中为S4对象定义动态构造函数?动态我的意思是:

firstClass <- setClass(Class = "firstClass",slots = c(Name = "character", ID = "numeric"))

现在我想定义一个智能的构造函数,即它检查函数调用提供的参数,并通过设置slot do default或者提供的参数来创建calss“firstClass”的对象。例如

firstClass <- function(Name, ID){
  if(missing(Name) & missing(ID)){
    return(new(Class = firstClass))
  }
  if(missing(Name) & !missing(ID)){
    return(new(Class = firstClass,ID = ID))
  }
  if(!missing(Name) & missing(ID)){
    return(new(Class,Name = Name))
  }
  if(!missing(Name) & !missing(ID)){
    return(new(Class, Name = Name, ID = ID))
  }
}

显然,也应该进行一些健全性检查。这个构造函数正是我想要的,取决于它构造一个对象的调用。但是,对于一个简单的类(几个插槽),这是可以的,但随着更多的插槽,复杂性增加。所以我想知道是否有一种优雅的方式来做到这一点。

1 个答案:

答案 0 :(得分:1)

使用原型提供合理的默认值

.firstClass <-
    setClass(Class = "firstClass",
             representation = representation(
               Name = "character",
               ID = "integer"),
             prototype=c(ID=0L))

在构造函数中使用默认值作为参数,并在必要时强制使用适当的类型

firstClass <- function(Name=character(), ID=0L)
    .firstClass(Name=Name, ID=as.integer(ID))

.firstClassnew("firstClass", ...)周围的一个轻量级包装器,对我而言,它在实现细节(调用new()构造一个类)和类构造的接口之间提供了一点分离。{{ 1}}是第二个更有用的层,以不需要知道底层类的方式向用户展示对象构造的必要参数。强制执行理智检查&#39;在有效性方法

firstClass()