Функция случайного воспроизведения в практическом программировании с R - PullRequest
0 голосов
/ 14 февраля 2020

Вот вопрос

Упражнение 8.3 (Переписать в случайном порядке) Переписать в случайном порядке, чтобы заменить копию колоды, которая живет в глобальной среде, на перемешанную версию DECK, неповрежденную копию колоды, которая также живет в глобальной окружающей среде. Новая версия shuffle не должна иметь аргументов и не возвращать ничего.

И ответ

shuffle <- function(){
    random <- sample(1:52, size = 52)
    assign("deck", DECK[random, ], envir = globalenv())
}

Мой вопрос

  1. Какой смысл добавлять новый объект "DECK", и почему он работает, даже если мы его не определяем?

  2. Перед функцией перемешивания мы определяем функцию сделки.

Это функция deal.

deal <- function(){
     card <- deck[1, ]
     assign("deck", deck[-1, ], envir = globalenv())
     card
}

Таким образом, после того, как мы сдаем карту, она удаляет карту, а затем сохраняет остальные карты в «колоде».

Поэтому, когда мы используем функцию перемешивания, извлеченная карта будет выглядеть как

    face     suit  value
NA  <NA>     <NA>    NA
17   ten    clubs    10

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 14 февраля 2020

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

Я думаю, что DECK предназначен для того, чтобы оставаться таким, какой он есть, и быть статичным c ресурсом из 52 значений, тогда как deck - это те же объекты, но в отдельном объекте, который имеет случайный порядок своих компонентов. Операция deal, вероятно, является всего лишь одним шагом в многоэтапном процессе, который приводит к нескольким, отдельным «ручным» объектам (возможно, по 5 карт каждая или две карты и одна открытая, в зависимости от конкретного типа покера). Вы не будете перетасовывать после выдачи определенной карты, а скорее «сдадите» следующую карту в (случайной) последовательности.

Автор этого назначения использует нефункциональный подход. Он создает объект внутри функции, но «выталкивает» его за пределы функциональной среды, где его результат действительно является побочным эффектом. Несколько комментаторов пытаются сделать его более «функциональным», создавая функцию, назначение которой выполнено после того, как функции функции завершены. В этом случае это действительно не меняет происходящего, но стратегия, предложенная автором, не считается наилучшей практикой R cognoscenti. Это может иметь значение в некоторых ситуациях, и мой совет - принять функциональный стиль, если вы можете.

Итак, теперь вы должны определить структуру данных, которая может держать несколько «рук», а затем написать код, который сохраняет отслеживание количества раздач и раздачи карт. Вы можете увеличивать количество рук и карт при каждой операции раздачи. Возможно, матрица?

DECK <- expand.grid(Suit =c('S','D','C','H'),
                    Val = c("A","K","Q","J",10:2) )
# insert the functions you already have.
Suitable control  ... perhaps nested `for`-loops? or nested `sapply` loops?
 {
 hand[i,j] <- deal()
 }

Был ли такой процесс проиллюстрирован на SO раньше? Возможно, даже вероятно. Выполните поиск по «картам колоды [r]»: { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...