Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何将S4类的访问器方法矢量化?_R_S4 - Fatal编程技术网

R 如何将S4类的访问器方法矢量化?

R 如何将S4类的访问器方法矢量化?,r,s4,R,S4,我正在写一个S4类,正在研究访问器方法。我想写一个方法,如果你给它一个或多个我的S4对象将返回一个向量与某个插槽的内容。下面是一些示例代码 setClass(Class="TestClass",slots=c(Type="character")) ### Creates Class setGeneric(name="getType",function(object){standardGeneric("getType")} ) setMethod(f="getTy

我正在写一个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")
我当然得到的不是“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)}

getType2我认为答案是否定的,你无法获得列表内容的分派;您可以编写一个getType、list方法。或者您可以创建一个包含测试类列表的TestList类,并为此编写一个方法。包中有一个用于此的通用容器

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或任意数量的“Test”元素

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

.Person = setClass("Person", representation(First="character", Last="character"))
friends = list(.Person(First="Bill", Last="Smith"),
               .Person(First="Sue", Last="Bird"))
与之相对的是,类对整个表进行建模,其中字段表示列

.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
对象的向量,但这对我来说似乎很尴尬,可能不是你的意思。但是,我看不到另一种方法来矢量化它,因为我正在编写的实际类有一大堆插槽,我认为我无法生成包含其他插槽的插槽。有什么想法吗?我编辑了我的回复,提供了一个编写矢量化(按列)类的示例;我不确定这对你是否有帮助。谢谢,这就澄清了很多问题。我有一些数据帧要添加到我的类中,但我认为这可以作为数组或合并的数据帧来完成。
.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"))