为什么 replicate() return 是一个矩阵?

Why does replicate() return a matrix?

> n_toss = 3; # Number of Tosses
> n_trial = 10; # Number of Trials
> 
> mySamples <- sample(c(1,0), n_toss, replace = T, prob=c(0.5,0.5))
> mySamples
[1] 1 0 1
> 
> mySamples <- replicate(n_trial, 
+              {
+                  mySamples <- sample(c(1,0), n_toss, replace = T, prob=c(0.5,0.5))
+              })
> mySamples
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0    1    1    0    1    0    0    0    0     0
[2,]    1    0    1    1    1    0    0    0    0     0
[3,]    0    0    0    0    1    1    1    1    0     1
> 

我这里有两个问题:

  1. 为什么 mySamples return 是矩阵?它不应该 return 最后一个(第 10 个)向量,因为 R 保持对最后一个语句的评估吗?
  2. 是否可以将 mySamples <- sample(c(1,0), n_toss, replace = T, prob=c(0.5,0.5)) 此语句保留在单独的函数中并仍然获得相同的结果?

replicatesapply 的包装器,因此它基本上适用于您的情况:

  • 计算并 return 表达式的结果
  • 这样做 n 次 - 在你的情况下 n_trial = 10
  • 将这 10 个结果组合在一起 - 默认情况下它将简化它们(在您的情况下为矩阵)。如果您不想简化结果,请使用 simplify = FALSE - 在这种情况下,您将获得一个列表(包含 10 个元素),每 10 次重复一次。

所以直接回答你的问题:

1) 是的,R 执行 return 最后一条语句的结果,但是执行 n_trial 次并将这些结果组合在一起。这就是为什么你得到一个矩阵(或一个列表,如果你在 replicate 的调用中使用 simplify = FALSE)。

2) 是的,你可以这样做,例如像这样:

n_toss <- 3
n_trial <- 10

sampleFun <- function(n_toss) {
  sample(c(1, 0), n_toss, replace = TRUE, prob = c(0.5, 0.5))
}

mySamples <- replicate(n_trial, sampleFun(n_toss = n_toss))