【问题标题】:Updating embedded data, for example sysdata.rda更新嵌入数据,例如 sysdata.rda
【发布时间】:2013-01-14 04:21:09
【问题描述】:

我最近提交给 CRAN 的申请被退回了,因为我有任务到现在不受欢迎的全球环境。

我有一个嵌入式数据集 (sysdata.rda),其中包含基于用户所在州(如美国)的配置参数。我希望这个嵌入式数据集在新用户使用该程序时可以更新。我之前在用户使用的初始函数中更新了这些数据,并通过全局分配使其可供用户访问。

我正在努力弄清楚如何更新此嵌入数据并使其成为用户在剩余会话中使用的默认数据。

以前我将数据存放在 /data 中,最近将其切换到 /R/sysdata.rda,因为它似乎更适合该语言环境。现在我不太确定了。

非常感谢任何帮助

【问题讨论】:

  • 安装到包后询问哪个状态,还是每次加载包时询问一次?
  • 他们用他们提供的数据加载包,并指出他们来自哪个州(例如,TX)。该包识别出它们的状态特定参数不是嵌入数据的一部分,尽可能地计算它们,然后将它们添加到嵌入数据集中。然后我遇到的问题是在整个会话的剩余时间里提供更新的数据集。我曾经通过将其分配给 .GlobalEnv 来做到这一点。

标签: r package


【解决方案1】:

关键是在全局环境之外的环境中进行赋值。有两种基本技术,使用local()<<- 或显式创建新环境:

使用显式环境很简单:创建环境,然后像列表一样分配给它:

my_opts <- new.env(parent = emptyenv())
set_state <- function(value) my_opts$state <- value
get_state <- function() my_opts$state

使用local() 稍微复杂一些,并且需要&lt;&lt;- 一些技巧

set_state <- NULL
get_state <- NULL

local({
  state <- NULL
  get_state <<- function() state
  set_state <<- function(value) state <<- value
})

有关&lt;&lt;- 工作原理的详细信息,请参阅“分配:将名称绑定到值”部分中的https://github.com/hadley/devtools/wiki/environments

【讨论】:

  • 非常有帮助!我走的是第一条路。如果函数没有找到状态的数据,它会创建一个环境并在嵌入数据中填充该状态的分支(每个状态都有一个分支的大列表)。然后将更新的数据分配给新环境。我现在与 R CMD check --as-cran 发生冲突,因为使用 'attach' 以便在退出函数后使用更新的数据。我不知道如何解决这个问题
  • 与其使用attach,不如编写一个访问所需数据的函数,并在整个代码中调用它。
  • 嗯。我肯定错过了什么。数据(我们称其为“internal_data”)在对函数的调用中被扩充。我不确定如何从该函数中获取增强的“internal_data”(我不想将其作为函数返回的一部分传回,因为这不是函数的重点)。我目前穷人的解决方案(通过 R CMD check --as-cran 是保存对象,然后将其加载到 .GlobalEnv 中。
  • @dbetebenner 你会像上面一样添加set_internal_dataget_internal_data,然后用它们设置一次数据,然后从其他函数中检索。
  • 成功了!关键是将 internal_data 创建为环境而不是列表!一旦进行了更改,更新函数中的 internal_data 就会持续存在!用于环境的代码与用于列表的代码有 99.9% 的相同!
【解决方案2】:

为什么在/data 中没有一个foo.R 文件,它会在用户调用data(foo) 时加载数据并更新数据?这是/data 的允许选项之一,但请注意Writing R Extensions 中的以下内容

注意R代码应该是“自给自足”的,不要使用包提供的额外功能,这样数据文件也可以在不加载包的情况下使用。

如果您可以接受该限制,那么data(foo) 可以加载数据、更新数据并确保它位于特定的命名对象中,然后您可以在函数中引用该对象。

【讨论】:

  • 未考虑 /data 中的 *.R 文件。我会试一试
猜你喜欢
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多