Как бы я зациклил свой код, чтобы иметь 4 гистограммы вместо 1?

#r

#r

Вопрос:

 N <- 10000 ; maxbound = 20 

one_side_normal <- function(N) {
  f <- numeric(N);
  for (i in 1:N) {
    X = rexp(1,rate=1);
    uniform = runif(1);
    while (uniform>exp((-X^2) X) ){
      X = rexp(1,rate=1);
      uniform=runif(1);
    }
    f[i] <- X
  }
  return(f)
}
 

Приведенный выше код представляет собой выборку из одностороннего нормального распределения (sample = 10000) с использованием метода принятия-отклонения. Как бы я зациклил этот код, чтобы выполнить 4 отдельных раза для выборок 10,100,1000 и 10000?

Ответ №1:

Мы можем использовать lapply для перебора N значений и применения функции. Поскольку существует только один аргумент, нам не нужна никакая лямбда-функция. Он вернет list

 lst1 <- lapply(c(10, 100, 1000, 10000), one_side_normal)
 

Другой вариант — классический for цикл. Чтобы сохранить выходные данные, мы можем создать a NULL list фиксированной длины, т.е. Длину вектора значений ‘N’. Затем выполните цикл по последовательности ‘N’, примените функцию и назначьте ( <- ) вывод соответствующему list элементу с этим индексом

 nvec <- c(10, 100, 1000, 10000)
lst1 <- vector('list', length(nvec))
for(i in seq_along(nvec)) lst1[[i]] <- one_side_normal(nvec[[i]])