将 R 中的教学结果保存为矩阵或对象
Saving instructional results in R as a matrix or object
在包CoinMinD I 运行 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
我正在尝试创建一个矩阵,其中前两行 Lower Limit 和 Upper Limit 如下所示:
[,1] [,2]
[1,] 0.03470190 0.5266663
[2,] 0.10880765 0.6718765
[3,] 0.15542939 0.7349127
[4,] 0.01035233 0.4413580
Unfo运行最近,当我将代码保存到一个对象时:
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
如您所写,GM 仅 return 最后一个值(音量)。所有其他值都简单地打印在控制台上。您可以使用 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
有趣的问题!幸运的是函数 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
中提取所需的列。
在包CoinMinD I 运行 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
我正在尝试创建一个矩阵,其中前两行 Lower Limit 和 Upper Limit 如下所示:
[,1] [,2]
[1,] 0.03470190 0.5266663
[2,] 0.10880765 0.6718765
[3,] 0.15542939 0.7349127
[4,] 0.01035233 0.4413580
Unfo运行最近,当我将代码保存到一个对象时:
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
如您所写,GM 仅 return 最后一个值(音量)。所有其他值都简单地打印在控制台上。您可以使用 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
有趣的问题!幸运的是函数 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
中提取所需的列。