2015-05-29 33 views
1

我正在R中编写一个模拟函数。我决定使用S4类在函数中返回两个值。当我运行模拟时,我想知道如何从输出中检索值以计算它们的分布时刻,如平均值?从R类中的S4类输出中检索一个值

setClass(Class="Coalescent", 
     representation(
      TMRCA="numeric", 
      t_total="numeric" 
      ) 
     ) 

输出看起来象下面这样:

> TMRCA_sim <-replicate(10000, Coalescent_fun(n, Ne)) 
> head(TMRCA_sim) 
[[1]] 
An object of class "Coalescent" 
Slot "TMRCA": 
[1] 6.723592 

Slot "t_total": 
[1] 9.693661 


[[2]] 
An object of class "Coalescent" 
Slot "TMRCA": 
[1] 1.592346 

Slot "t_total": 
[1] 11.50406 

我希望做的是提取“TMRCA”和“t_total”的所有值计算平均数。当然,我可以使用许多其他方式来进行模拟,但我想同时学习使用类。

+0

你想要所有TMRCA值的均值和所有t_total值的均值吗?或每个TMRCA/t_total对的平均值?如果是前者,你可能想重新考虑你的班级结构。 – BrodieG

+0

我想要所有TMRCA值的均值和所有t_total值的均值。 – Homap

回答

1

您可以提取您的数据转换成一个矩阵:

mx <- sapply(TMRCA_sim, function(x) sapply(slotNames(x), slot, object=x)) 

对于一些由数据这是mx样子:

   [,1]  [,2]  [,3]  [,4]  [,5] 
TMRCA 0.3823880 0.3403490 0.5995658 0.1862176 0.6684667 
t_total 0.8696908 0.4820801 0.4935413 0.8273733 0.7942399 

然后你就可以使用rowMeansapply

rowMeans(mx) 
apply(mx, 1, mean) # equivalent, though slower and more flexible 
apply(mx, 1, var) 

虽然正如我在我的评论中指出的,这是在R中做事情的速度非常慢。您希望Coalescent_fun能够生成具有两个向量的对象,每个向量具有多个条目,而不是每个模拟一个对象。

+0

如果还有其他插槽,它们的值不是标量,那么最好使用sapply(TMRCA_sim,slot,“TMRCA”)和sapply(TMRCA_sim,slot,“t_total”)'。 –

+0

@ JoshO'Brien,绝对是(或者至少使用'vapply',这样就不会产生奇怪的结构) – BrodieG