当对R对象进行子集操作时,保留类属性。

8
我有一个名为gene_table的R对象,它的类是foo。现在我通过以下方式对gene_table进行子集操作:
gene_data = gene_table[1:100,1:5]
然而,当调用class(gene_data)时,它不再属于类foo,而是属于类matrix。这让我很头痛,因为我的方法summary.foo无法识别矩阵类的gene_data对象。我希望在子集操作时保留原始的类属性,请问有什么方法可以做到吗?谢谢!
更新:dput(head(gene_table))给出了以下结果:
c(5.21708054951994, 5.01224214039806, 4.92160314073853, 4.83031021496, 4.78552614584879, 4.77821370665578)

并且 str(gene_table) 让我得到了

 foo [1:22743, 1:2] 5.22 5.01 4.92 4.83 4.79 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:22743] "ENSG00000127954" "ENSG00000151503" "ENSG00000096060" "ENSG00000091879" ...
  ..$ : chr [1:2] "Var1" "Var2"

@JoshuaUlrich:您能具体说一下吗?是指在子集中的 .foo 吗?谢谢! - alittleboy
你能提供 dput(head(gene_table)) 的输出吗?我猜它实际上不是 foo 类的,需要查看真正类的提取方法。 - IRTFM
1
他的意思是你可能需要编写一个与foo相对应的 [ 方法(就像你用 summary 做的那样)。 - joran
@DWin:如果子集删除了类,则head将具有相同的效果,因为它对对象进行子集化。 str的输出显示gene_table的类为“foo”。 - Joshua Ulrich
3
?"[":使用下标索引(除非为空)将删除所有属性,除了名称、维度和维度名称。 - James
1个回答

6
您可以将以下内容作为“[.foo]”的定义:

您可以使用类似以下的内容作为“[.foo]”的定义:

`[.foo` <- function(x, ..., drop=TRUE) {
   structure(NextMethod(), class="foo")
}

根据您的"foo"类的复杂性,您可能需要添加其他内容。


更加优雅。如果类是多个类的向量,类是否也应该设置为class=class(x) - Josh O'Brien
@JoshO'Brien:是的,我只能说那属于“其他事情”的范畴。;-) - Joshua Ulrich
好的,我忘记了。我必须记住——仅因为代码框被突出显示,并不意味着它是我需要关注的唯一部分! - Josh O'Brien
@JoshO'Brien @Joshua Ulrich:非常感谢您们提供的代码!运行此代码后,我发现 gene_data 的类是 foo。但还有一件事我不确定:如果我要编写一个软件包,如何包含这个[.foo函数?我需要打开一个新的 R 文件并像其他函数一样记录此函数吗? - alittleboy
@alittleboy:你需要阅读《编写R扩展》(http://cran.r-project.org/doc/manuals/R-exts.html)。特别是要注意[注册S3方法](http://cran.r-project.org/doc/manuals/R-exts.html#Registering-S3-methods)一节。 - Joshua Ulrich
@JoshuaUlrich:非常感谢!我会仔细阅读这份文档……我刚意识到在这个文件中我错过了一些重要的东西。 - alittleboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接