【问题标题】:How can I vectorize an accessor method for a S4 class?如何矢量化 S4 类的访问器方法?
【发布时间】:2014-03-14 17:56:45
【问题描述】:

我正在编写一个 S4 类并且正在研究访问器方法。我想写一个方法,如果你给它一个或多个我的 S4 对象将返回一个包含某个插槽内容的向量。这是一些示例代码

setClass(Class="TestClass",slots=c(Type="character"))   ### Creates Class             

setGeneric(name="getType",function(object){standardGeneric("getType")} )

setMethod(f="getType", signature="TestClass",      ### accessor for "TYPE
      function(object){object@Type})

现在我制作了两个对象:

 FOO<-new("TestClass",Type="A")
 BAR<-new("TestClass",Type="B")

使用getType(FOO) 按计划工作。但是,当我这样做时:

Both<-c(FOO,BAR)
getType (Both)

而不是得到"A","B"我当然得到:

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘getType’ 
  for signature ‘"list"’

这并不奇怪。我知道我可以写一个类似的函数

getType2<-function(object){sapply(object, FUN=getType)}

那会给我我想要的。但是,有没有办法在访问器函数本身中做到这一点?我可以矢量化@ 吗?

【问题讨论】:

    标签: r s4


    【解决方案1】:

    我认为答案是否定的,您无法发送列表内容;你可以写一个getType,list-method。或者您可以创建一个包含测试类列表的 TestList 类并为此编写一个方法。 IRanges 包有一个用于此的通用容器...

    library(IRanges)
    .TestList = setClass("TestList", contains="SimpleList", 
        prototype=c(elementType="Test"))
    TestList = function(...) .TestList(listData=list(...))
    lst = TestList(FOO, BAR)
    lst[[1]]
    

    或者在我看来,最好的解决方案是编写你的类,使其已经矢量化,就像 character() 被矢量化一样——0、1 或任意数量的“测试”元素。

    一个简单的例子是为一群人建模。非 R 方式会考虑每行一个人,一个集合(这里是一个列表)代表几个人:

    .Person = setClass("Person", representation(First="character", Last="character"))
    friends = list(.Person(First="Bill", Last="Smith"),
                   .Person(First="Sue", Last="Bird"))
    

    相对于更 R 的方式,该类对整个表进行建模,其中字段表示列。

    .People = setClass("People", representation(First="character", Last="character"))
    setMethod(show, "People", function(object) {
        print(data.frame(First=object@First, Last=object@Last))
    })
    
    friends = .People(First=c("Bill", "Sue"), Last=c("Smith", "Bird"))
    

    【讨论】:

    • 感谢您的回答。我喜欢从一开始就进行矢量化的想法,但我不确定如何最好地做到这一点。我可以编写一个TestClass 类,然后创建一个新的VectorTest 类,其插槽是TestClass 对象的向量,但这对我来说似乎很尴尬,可能不是你的意思。但是,我看不到另一种矢量化方法,因为我正在编写的实际类有一大堆插槽,而且我认为我不能制作一个包含其他插槽的插槽。有什么想法吗?
    • 我编辑了我的回复以提供一个编写矢量化(按列)类的说明;不确定对您有帮助。
    • 谢谢,这澄清了很多事情。我有一些数据框要添加到我的课程中,但我认为这可以作为数组或合并的数据框来完成。
    猜你喜欢
    • 2018-10-01
    • 2017-07-04
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多