将R中的指导结果保存为矩阵或对象

时间:2016-10-07 01:15:06

标签: r matrix instructions

在CoinMinD包中,我使用以下代码运行GM函数:

GM(c(2,4,5,1),0.05)

结果如下:

Original Intervals
Lower Limit
[1] 0.03470190 0.10880765 0.15542939 0.01035233
Upper Limit
[1] 0.5266663 0.6718765 0.7349127 0.4413580
Adjusted Intervals
Lower Limit
[1] 0.03470190 0.10880765 0.15542939 0.01035233
Upper Limit
[1] 0.5266663 0.6718765 0.7349127 0.4413580
Volume
[1] 0.06918613

我正在尝试创建一个矩阵,前两行下限和上限,如下所示:

     [,1]      [,2]
[1,]    0.03470190 0.5266663
[2,]    0.10880765 0.6718765
[3,]    0.15542939 0.7349127
[4,]    0.01035233 0.4413580

不幸的是,当我将代码保存到对象时:

c<-GM(c(2,4,5,1),0.05) 

并运行

c[1] 

GM(c(2,4,5,1),0.05) [1]

我只得到结果的最后一行:

> c[1]
[1] 0.06918613

2 个答案:

答案 0 :(得分:1)

正如您所写,GM只返回最后一个值(Volume)。所有其他值都只是打印在控制台上。您可以使用capture.output捕获它们,使用strsplit获取值:

library(CoinMinD)
cmd<-capture.output(GM(c(2,4,5,1),0.05) )
matrix(c(as.numeric(strsplit(cmd[3] , split=" ")[[1]][2:5]),
         as.numeric(strsplit(cmd[5] , split=" ")[[1]][2:5])), 
       nrow=4)

           [,1]      [,2]
[1,] 0.03470190 0.5266663
[2,] 0.10880765 0.6718765
[3,] 0.15542939 0.7349127
[4,] 0.01035233 0.4413580

答案 1 :(得分:1)

有趣的问题!幸运的是,函数GM不长,所以我们可以看一下:

function (inpmat, alpha) 
{
    ## ... those lines for computing results are left out...
    cat("Original Intervals\n")
    cat("Lower Limit\n")
    print(GM.LL)
    cat("Upper Limit\n")
    print(GM.UL)
    cat("Adjusted Intervals\n")
    cat("Lower Limit\n")
    print(LLA)
    cat("Upper Limit\n")
    print(ULA)
    cat("Volume\n")
    print(VOL)
}

您要提取的所有值仅打印而不是导出。我们可以轻松修改此功能以将其导出。

myGM <- function (inpmat, alpha) 
{
    k = length(inpmat)
    s = sum(inpmat)
    chi = qchisq(1 - (alpha/k), df = 1)
    pi = inpmat/s
    GM.UL = (chi + 2 * inpmat + sqrt(chi * chi + 4 * inpmat * 
        chi * (1 - pi)))/(2 * (chi + s))
    GM.LL = (chi + 2 * inpmat - sqrt(chi * chi + 4 * inpmat * 
        chi * (1 - pi)))/(2 * (chi + s))
    LLA = 0
    ULA = 0
    for (r in 1:length(inpmat)) {
        if (GM.LL[r] < 0) 
            LLA[r] = 0
        else LLA[r] = GM.LL[r]
        if (GM.UL[r] > 1) 
            ULA[r] = 1
        else ULA[r] = GM.UL[r]
    }
    diA = ULA - LLA
    VOL = round(prod(diA), 8)
    ## the lines for printing are removed
    ## replace it with the line below
    list(limit = matrix(c(GM.LL, GM.UL, LLA, ULA), ncol = 4L,
                        dimnames = list(NULL, c("ori_low", "ori_up", "adj_low", "adj_up"))),
         volume = VOL)
}

## test
myGM(c(2,4,5,1),0.05)

#$limit
#        ori_low    ori_up    adj_low    adj_up
#[1,] 0.03470190 0.5266663 0.03470190 0.5266663
#[2,] 0.10880765 0.6718765 0.10880765 0.6718765
#[3,] 0.15542939 0.7349127 0.15542939 0.7349127
#[4,] 0.01035233 0.4413580 0.01035233 0.4413580
#
#$volume
#[1] 0.06918613

您可以从$limit轻松提取所需的列。