Объект R неправильно сохраняется в среде выполнения

#r

#r

Вопрос:

В настоящее время я читаю «Практическое программирование с помощью R», часть II, где мы создаем колоду карт. В главе 6 мы создаем замыкание, чтобы функции и объекты хранились в другой среде R и не нуждались в каких-либо объектах в глобальной среде для правильной работы. У меня возникли проблемы с обеспечением того, чтобы объект «BJDECK», из которого получен весь процесс (функции перемешивания и раздачи), был правильно представлен в этой новой среде.

Пока что это процесс:

  1. Я импортирую deck.csv, фрейм данных с 52 строками и 3 переменными («лица», «костюмы», «значение»).
  2. Я изменяю значения карт, запуская это, чтобы соответствовать колоде для блэкджека:
 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.
  
  1. С этим объектом «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.
  
  1. Пока все хорошо, в GlobalEnv объект «bjdeckorigin» представляет собой фрейм данных с 52 наблюдениями и 3 переменными (обычными). Перемешивание и обработка работают так, как задумано.
  2. Проблема в том, что, когда я очищаю 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, чтобы избежать перезаписи функций или чего-то подобного.