Хранить значения из цикла - PullRequest
       4

Хранить значения из цикла

0 голосов
/ 29 сентября 2018

Я имитирую броски костей и хотел бы сохранить выходные данные в одном объекте, но не могу найти способ сделать это.Я попытался посмотреть здесь , здесь и здесь , но они, похоже, не отвечают на мой вопрос.

Вот моя попытка назначитьрезультат испытания 20 x 3 для объекта:

set.seed(1) 
Twenty = for(i in 1:20){   
  trials = sample.int(6, 3, replace = TRUE)   
  print(trials)   
  i = i+1 
}
print(Twenty)

Чего я не понимаю, так это почему я не могу вызвать функцию после ее запуска?

Я также попытался использовать return вместо print в функции:

Twenty = for(i in 1:20){
  trials = sample.int(6, 3, replace = TRUE)
  return(trials)
  i = i+1
}
print(Twenty)

или сначала создать пустую матрицу:

mat = matrix(0, nrow = 20, ncol = 3)
mat    
for(i in 1:20){
  mat[i] = sample.int(6, 3, replace = TRUE)
  print(mat)
  i = i+1
}

но они кажутсябыть хуже (поскольку я даже не могу видеть испытания).

Спасибо за любые подсказки.

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Обычно в большинстве языков программирования объекты не присваиваются циклам for, поскольку они не являются формально функциональными объектами.Один использует циклы для итеративного взаимодействия с существующими объектами.Однако R поддерживает семейство apply , которое сохраняет итеративные выходные данные для объектов такой же длины, что и входные данные.

Рассмотрим lapply ( l ist apply) для вывода списка илиsapply ( s подразумевается, применимо) для вывода матрицы:

# LIST OUTPUT
Twenty <- lapply(1:20, function(x) sample.int(6, 3, replace = TRUE))

# MATRIX OUTPUT
Twenty <- sapply(1:20, function(x) sample.int(6, 3, replace = TRUE))

А чтобы увидеть свои испытания, просто распечатайте объект

print(Twenty)

Но так как выникогда не используйте переменную итератора, x, рассмотрите replicate (обертку до sapply, которая одним аргументом может вывести матрицу или список), которая получает аргументы размера и выражения (без входных данных или функций):

# MATRIX OUTPUT (DEFAULT)
Twenty <- replicate(20, sample.int(6, 3, replace = TRUE))

# LIST OUTPUT
Twenty <- replicate(20, sample.int(6, 3, replace = TRUE), simplify = FALSE)
0 голосов
/ 29 сентября 2018

В ваших попытках есть несколько ошибок:

1) Цикл не является ни функцией, ни объектом в R, поэтому нет смысла присваивать цикл переменной

2) Если у вас есть цикл for(i in 1:20), цикл будет увеличиваться i, поэтому нет смысла добавлять i = i + 1.

Ваша последняя попытка, реализованная правильно, будет выглядеть следующим образом:

mat <- matrix(0, nrow = 20, ncol = 3)
for(i in 1:20){
     mat[i, ] = sample.int(6, 3, replace = TRUE)
}
print(mat)

Лично я бы просто сделал

matrix(sample.int(6, 20 * 3, replace = TRUE), nrow = 20)

(поскольку все розыгрыши независимы и имеют замену, не имеет значения, делаете ли вы 3 ничьи 20 раз или просто 60 ничьих)

0 голосов
/ 29 сентября 2018

Вы можете использовать список:

Twenty=list()
for(i in 1:20){
  Twenty[[i]] = sample.int(6, 3, replace = TRUE)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...