首页 > 解决方案 > R 对象未在运行时环境中正确存储

问题描述

我目前正在阅读“使用 R 进行动手编程”,第二部分我们创建了一副纸牌。在第 6 章中,我们创建了一个闭包,以便将函数和对象存储在其他 R 环境中,并且不需要全局环境中的任何对象来正常工作。我无法确保在这个新环境中正确表示所有进程的派生对象“BJDECK”(shuffle 和 deal 函数)。

到目前为止,这是一个过程:

  1. 我导入了deck.csv,这是一个包含 52 行和 3 个变量(“faces”、“suits”、“value”)的数据框
  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. 使用 GlobalEnv 中的这个“bjdeck”对象,我运行以下脚本:
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 个变量)的数据框。第一个观察结果(“king”、“spades”、10)总是丢失。shuffle 和 deal 函数工作正常,但是如果,例如,我运行:
replicate(52, deal())

最后一个值是 NA、NA、NA,这应该是牌组中的最后一张牌(无论它是什么)。当我在清理 GlobalEnv 之前对其进行测试时,此复制函数会返回正确的值。

我已经尝试了我所知道的一切(而且我是一个完整的初学者)来弄清楚,但我一直得到相同的结果。

我感谢您的帮助。提前致谢。

标签: r

解决方案


推荐阅读