使用replicate进行用户定义包含mapply和输出列表的函数

时间:2015-08-02 17:40:19

标签: r replicate

我可以使用以下MyFun(用户定义)函数来模拟观察。但是当函数返回输出列表时,无法弄清楚如何用replicate函数重复此函数。

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

2 个答案:

答案 0 :(得分:3)

你的功能确实有效,它只有一个奇怪的&#34;输出。尝试将结果存储到名为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"

事实上,如果你提取第一个&#34;单元&#34;在前面的矩阵中,您会看到这是一个包含MyFun输出的矩阵:

 aa[1,1]
[[1]]
    V1 V2 V3 V4 V5
0.2  0  1  0  0  1
0.4  1  2  0  2  0

答案 1 :(得分:3)

尝试向您的函数添加简化参数,并将其传递给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)
}

然后使用simplify = FALSE中的replicate()调用它。这将生成一个长度为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