Почему replicate () возвращает матрицу? - PullRequest
1 голос
/ 31 мая 2019
> 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 возвращает матрицу? Разве он не должен возвращать последний (10-й) вектор, поскольку R сохраняет последний вычисляемый оператор?
  2. Можно ли сохранить mySamples <- sample(c(1,0), n_toss, replace = T, prob=c(0.5,0.5)) этот оператор в отдельной функции и при этом получить тот же результат?

1 Ответ

1 голос
/ 31 мая 2019

replicate - это обертка вокруг sapply, поэтому в вашем случае это будет по существу:

  • оценивать и возвращать результаты выражения
  • сделать это nраз - в вашем случае n_trial = 10 раз
  • объедините эти 10 результатов вместе - по умолчанию это упростит их (в матрицу в вашем случае).Если вы не хотите, чтобы результаты были упрощены, используйте simplify = FALSE - в этом случае вы получите список (из 10 элементов), по одному для каждой из 10 копий.

Итак, чтобы ответить на ваши вопросынапрямую:

1) Да, R возвращает результат последнего оператора, но делает это n_trial раз и объединяет эти результаты вместе.Вот почему вы получаете матрицу (или список, если вы используете simplify = FALSE в вызове replicate).

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))
...