为什么 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
>
我这里有两个问题:
- 为什么
mySamples
return 是矩阵?它不应该 return 最后一个(第 10 个)向量,因为 R 保持对最后一个语句的评估吗?
- 是否可以将
mySamples <- sample(c(1,0), n_toss, replace = T, prob=c(0.5,0.5))
此语句保留在单独的函数中并仍然获得相同的结果?
replicate
是 sapply
的包装器,因此它基本上适用于您的情况:
- 计算并 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))
> 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
>
我这里有两个问题:
- 为什么
mySamples
return 是矩阵?它不应该 return 最后一个(第 10 个)向量,因为 R 保持对最后一个语句的评估吗? - 是否可以将
mySamples <- sample(c(1,0), n_toss, replace = T, prob=c(0.5,0.5))
此语句保留在单独的函数中并仍然获得相同的结果?
replicate
是 sapply
的包装器,因此它基本上适用于您的情况:
- 计算并 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))