#r
#r
Вопрос:
В настоящее время я читаю «Практическое программирование с помощью R», часть II, где мы создаем колоду карт. В главе 6 мы создаем замыкание, чтобы функции и объекты хранились в другой среде R и не нуждались в каких-либо объектах в глобальной среде для правильной работы. У меня возникли проблемы с обеспечением того, чтобы объект «BJDECK», из которого получен весь процесс (функции перемешивания и раздачи), был правильно представлен в этой новой среде.
Пока что это процесс:
- Я импортирую deck.csv, фрейм данных с 52 строками и 3 переменными («лица», «костюмы», «значение»).
- Я изменяю значения карт, запуская это, чтобы соответствовать колоде для блэкджека:
deck <- data.frame(
face = rep(c("ace","king","queen","jack", 10:2), 4),
suit = rep(c("heart","diamond","spade","club"), each=13)
)
bjdeck <- deck
bjdeck$value[bjdeck$face %in% c("king", "queen", "jack")] <- 10
bjdeck$value[bjdeck$face == "ace"] <- NA ##Because an Ace value can be 1 or 11.
- С этим объектом «bjdeck» в GlobalEnv я запускаю следующий скрипт:
setup <- function(abjdeck) { ##"abjdeck" stands for "a blackjack deck"
BJDECK <- bjdeck ##To create a copy of the original blackjack deck in the new environment.
SHUFFLE <- function() {
random <- sample(1:52, size = 52)
assign("abjdeck", BJDECK[random, ], envir = parent.env(environment()))
}
DEAL <- function() {
card <- abjdeck[1, ]
assign("abjdeck", abjdeck[-1, ], envir = parent.env(environment()))
card
}
list(deal = DEAL, shuffle = SHUFFLE, bjdeckorigin = BJDECK)
}
cards <- setup(bjdeck) ##To visualize in GlobalEnv everything that setup function contains, as far as I understand.
deal <- cards$deal
shuffle <- cards$shuffle
bjdeckorigin <- cards$bjdeckorigin ##I added this piece of code, because I was wondering how the BJDECK object from which the randomization was taking place was like.
- Пока все хорошо, в GlobalEnv объект «bjdeckorigin» представляет собой фрейм данных с 52 наблюдениями и 3 переменными (обычными). Перемешивание и обработка работают так, как задумано.
- Проблема в том, что, когда я очищаю GlobalEnv, а затем снова запускаю скрипт в третьей точке, «bjdeckorigin» теперь представляет собой фрейм данных, содержащий только 51 наблюдение (и 3 переменные). Первое наблюдение («король», «пики», 10) всегда теряется. Функции перемешивания и раздачи работают нормально, но если, например, я запустил:
replicate(52, deal())
Последнее значение — NA, NA, NA, и это должна быть последняя карта в колоде (какой бы она ни была). Эта функция репликации возвращает правильные значения, когда я тестирую ее перед очисткой GlobalEnv.
Я перепробовал все, что знаю (и я полный новичок), чтобы разобраться в этом, но я продолжаю получать тот же результат.
Я ценю вашу помощь. Заранее спасибо.
Комментарии:
1. Как именно вы очищаете глобальную среду? Вы удаляете все, включая созданную вами
cards
переменную, и просто запускаетеsetup()
снова? Ноbjdeck
больше не существует? Мне не ясно, что именно вы используете.2. @MrFlick Да, я удаляю все объекты и функции в GlobalEnv с
rm(list=ls())
помощью консоли. Я также попробовал метлу, которая отображается в верхнем правом окне (где отображаются все объекты и функции в среде). Таким образом, все, включая bjdeck, больше не существует. Я делаю это, потому что в книге говорится, что если вы запуститеsetup()
снова, у вас будет автономная колода карт, готовая к игре, в среде, недоступной для GlobalEnv, чтобы избежать перезаписи функций или чего-то подобного.