2017-04-12 45 views
1

我試圖從BiodiversityR程序包中保存CAPdiscrim函數的分類成功率。爲CAPdiscrimhttps://www.rdocumentation.org/packages/BiodiversityR/versions/2.7-2/topics/CAPdiscrim)暗角提供了有關如何獲取分類成功率爲例:保存爲循環輸出與控制檯中的輸出不同 - R

library(BiodiversityR) 
library(vegan) 
library(MASS) 
data(dune) 
data(dune.env) 

for (mseq in 1:14) { 
    CAPdiscrim.result <- CAPdiscrim(dune~Management, data=dune.env, 
     dist="bray", axes=2, m=mseq) 
} 

這會自動打印在控制檯例如分類結果的百分比。

Overall classification success: 40 percent 
BF (n=3) correct: 0 percent 
HF (n=5) correct: 40 percent 
NM (n=6) correct: 33.3333333333333 percent 
SF (n=6) correct: 66.6666666666667 percent 

然而調用循環外CAPdiscrim.result對象時,它產生實際CAPdiscrim結果,如(str(CAPdiscrim.result))。

List of 14 
$ PCoA  : num [1:20, 1:2] -0.3547 -0.2946 -0.0728 -0.0693 -0.3071 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:20] "1" "2" "3" "4" ... 
    .. ..$ : NULL 
$ m   : int 14 
$ tot   : num 4.3 
$ varm  : num 107 
$ group  : Factor w/ 4 levels "BF","HF","NM",..: 4 1 4 4 2 2 2 2 2 1 ... 
$ CV   : Factor w/ 4 levels "BF","HF","NM",..: 1 2 4 4 3 2 2 1 1 2 ... 
$ percent  : num 40 
$ x   : num [1:20, 1:3] 7.64 0.18 9.43 8.88 -1.93 ... 

等等,等等

我覺得我已經想盡一切辦法保存在運行for loop的時間打印在控制檯中精確的輸出。我已嘗試創建空的list s,空^s,綁定結果。我只是不知道如何存儲它!任何幫助將不勝感激。

+0

該代碼應該可重現嗎?是的,我只想保存這些字符串。即使它被覆蓋,我也可以單獨獲取最後一個字符串。但是我得到的是實際的CAPdiscrim結果,即整個統計輸出。 –

+0

對不起,這是可重複的。我有一個不同的錯誤,我誤解了。 – MrFlick

回答

1

這些字符串在函數調用期間通過cat()寫出到控制檯。如果您想要獲取這些值,請使用capture.output。例如,

myout<-lapply(1:14, function(mseq) { 
    msg <- capture.output(
     CAPdiscrim.result <- CAPdiscrim(dune~Management, data=dune.env, 
     dist="bray", axes=2, m=mseq), 
    type="output") 
    list(msg=msg, result=CAPdiscrim.result) 
}) 

這將捕獲列表中的結果和字符串。您可以通過

myout[[1]]$msg 

例如。

+0

非常感謝,這真是太棒了。 –

1

for循環將只保留mseq值的最後一個CAPdiscrim.result,同時覆蓋循環中的前13個結果。

反而失去他們的,使用lapply代替

CAPdiscrim.result <- lapply(1:14, function(mseq){ 
        CAPdiscrim(dune~Management, data=dune.env, 
        dist="bray", axes=2, m=mseq) 
        }) 

這將產生14筆,每次每個MSEQ值的列表。

如果您感興趣的是分類成功的控制檯輸出,那麼最簡單的方法就是將控制檯輸出作爲文本文件下沉。

sink("output_text.txt") 
for (mseq in 1:14) { 
     CAPdiscrim.result <- CAPdiscrim(dune~Management, data=dune.env, 
           dist="bray", axes=2, m=mseq) 
     } 
sink() 
+0

非常感謝。我將其他答案標記爲正確,因爲我可以繼續以這種方式操作R中的數據。歡呼聲 –