2015-05-29 34 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