保存的循环输出与控制台中的不同 - R

时间:2017-04-12 03:16:19

标签: r for-loop statistics vegan

我正在尝试从CAPdiscrim包中保存BiodiversityR函数的分类成功率。 CAPdiscrimhttps://www.rdocumentation.org/packages/BiodiversityR/versions/2.7-2/topics/CAPdiscrim)的插图给出了如何获得分类成功率的示例:

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,空data.frame s,绑定结果。我只是想不出如何存储它!任何帮助将不胜感激。

2 个答案:

答案 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()

答案 1 :(得分: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

例如。