对包含 mapply 和输出列表的用户定义函数使用复制
Using replicate for user define function containing mapply and list of output
我可以使用以下 MyFun
(用户定义)函数来模拟观察。但是想不通怎么用replicate
函数重复这个函数,当函数returns输出一个列表。
MyFun <- function(nSim, Size, Prob) {
M1 <- t(mapply(rbinom, prob = Prob, n = nSim, size = Size))
dimnames(M1) <- list(Prob, paste0("V", 1:nSim))
MeanM1 <- M1/Size
Results1 <- list(M1, MeanM1)
return(Results1)
}
MyFun(nSim=5, Size=4, Prob=c(0.2, 0.4))
[[1]]
V1 V2 V3 V4 V5
0.2 2 2 1 2 1
0.4 2 3 0 3 1
[[2]]
V1 V2 V3 V4 V5
0.2 0.5 0.50 0.25 0.50 0.25
0.4 0.5 0.75 0.00 0.75 0.25
但是 replicate
函数没有给出想要的结果。
replicate(
n=2
, MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4))
, simplify = "array"
)
[,1] [,2]
[1,] Integer,10 Integer,10
[2,] Numeric,10 Numeric,10
您的函数确实有效,它只有一个 "strange" 输出。尝试将结果存储到名为 aa
.
的对象中
aa <- replicate(
+ n=2
+ , MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4))
+ , simplify = T
+ )
aa
[,1] [,2]
[1,] Integer,10 Integer,10
[2,] Numeric,10 Numeric,10
但是那个 2 x 2 矩阵的每个元素本身就是一个矩阵。试试这个:
class(aa)
[1] "matrix"
sapply(aa, class)
[1] "matrix" "matrix" "matrix" "matrix"
事实上,如果您提取前一个矩阵的第一个 "cell",您会发现该矩阵确实包含 MyFun
:
的输出
aa[1,1]
[[1]]
V1 V2 V3 V4 V5
0.2 0 1 0 0 1
0.4 1 2 0 2 0
尝试向您的函数添加一个简化参数,并将其传递给 mapply()
。
MyFun <- function(nSim, Size, Prob, simplify = "array") {
M1 <- t(
mapply(rbinom, prob = Prob, n = nSim, size = Size, SIMPLIFY = simplify)
)
dimnames(M1) <- list(Prob, paste0("V", 1:nSim))
MeanM1 <- M1/Size
Results1 <- list(M1, MeanM1)
return(Results1)
}
然后这样调用它,在replicate()
中使用simplify = FALSE
。这将生成一个长度为 2 的列表,每个元素包含两个数组。
replicate(2, MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4)), simplify = FALSE)
[[1]]
[[1]][[1]]
V1 V2 V3 V4 V5
0.2 1 0 2 0 0
0.4 2 0 1 1 0
[[1]][[2]]
V1 V2 V3 V4 V5
0.2 0.5 0 1.0 0.0 0
0.4 1.0 0 0.5 0.5 0
[[2]]
[[2]][[1]]
V1 V2 V3 V4 V5
0.2 0 0 0 0 1
0.4 2 1 1 1 0
[[2]][[2]]
V1 V2 V3 V4 V5
0.2 0 0.0 0.0 0.0 0.5
0.4 1 0.5 0.5 0.5 0.0
我可以使用以下 MyFun
(用户定义)函数来模拟观察。但是想不通怎么用replicate
函数重复这个函数,当函数returns输出一个列表。
MyFun <- function(nSim, Size, Prob) {
M1 <- t(mapply(rbinom, prob = Prob, n = nSim, size = Size))
dimnames(M1) <- list(Prob, paste0("V", 1:nSim))
MeanM1 <- M1/Size
Results1 <- list(M1, MeanM1)
return(Results1)
}
MyFun(nSim=5, Size=4, Prob=c(0.2, 0.4))
[[1]]
V1 V2 V3 V4 V5
0.2 2 2 1 2 1
0.4 2 3 0 3 1
[[2]]
V1 V2 V3 V4 V5
0.2 0.5 0.50 0.25 0.50 0.25
0.4 0.5 0.75 0.00 0.75 0.25
但是 replicate
函数没有给出想要的结果。
replicate(
n=2
, MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4))
, simplify = "array"
)
[,1] [,2]
[1,] Integer,10 Integer,10
[2,] Numeric,10 Numeric,10
您的函数确实有效,它只有一个 "strange" 输出。尝试将结果存储到名为 aa
.
aa <- replicate(
+ n=2
+ , MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4))
+ , simplify = T
+ )
aa
[,1] [,2]
[1,] Integer,10 Integer,10
[2,] Numeric,10 Numeric,10
但是那个 2 x 2 矩阵的每个元素本身就是一个矩阵。试试这个:
class(aa)
[1] "matrix"
sapply(aa, class)
[1] "matrix" "matrix" "matrix" "matrix"
事实上,如果您提取前一个矩阵的第一个 "cell",您会发现该矩阵确实包含 MyFun
:
aa[1,1]
[[1]]
V1 V2 V3 V4 V5
0.2 0 1 0 0 1
0.4 1 2 0 2 0
尝试向您的函数添加一个简化参数,并将其传递给 mapply()
。
MyFun <- function(nSim, Size, Prob, simplify = "array") {
M1 <- t(
mapply(rbinom, prob = Prob, n = nSim, size = Size, SIMPLIFY = simplify)
)
dimnames(M1) <- list(Prob, paste0("V", 1:nSim))
MeanM1 <- M1/Size
Results1 <- list(M1, MeanM1)
return(Results1)
}
然后这样调用它,在replicate()
中使用simplify = FALSE
。这将生成一个长度为 2 的列表,每个元素包含两个数组。
replicate(2, MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4)), simplify = FALSE)
[[1]]
[[1]][[1]]
V1 V2 V3 V4 V5
0.2 1 0 2 0 0
0.4 2 0 1 1 0
[[1]][[2]]
V1 V2 V3 V4 V5
0.2 0.5 0 1.0 0.0 0
0.4 1.0 0 0.5 0.5 0
[[2]]
[[2]][[1]]
V1 V2 V3 V4 V5
0.2 0 0 0 0 1
0.4 2 1 1 1 0
[[2]][[2]]
V1 V2 V3 V4 V5
0.2 0 0.0 0.0 0.0 0.5
0.4 1 0.5 0.5 0.5 0.0