【问题标题】:Save package settings between sessions在会话之间保存包设置
【发布时间】:2022-04-20 00:53:23
【问题描述】:

是否有明确的方法可以在会话之间保存与某个包有关的选项或信息?

例如,假设有人制作了一款游戏并将其作为 R 包发布。如果他们想保存高分而不是每次 R 开始新会话时都重置它们,那么最好的方法是什么?目前我只能考虑在用户主目录中存储一个文件,但我不确定我是否喜欢这种方法。

【问题讨论】:

  • 不是为了 R 包本身,但在 nix 世界中,将这种东西存储在用户主目录的隐藏文件或隐藏目录中是相当典型的。在 Windows 上,您可能会使用应用数据目录或注册表。
  • 我自己也有同样的问题,我认为他的关键可能在这个 SO 帖子中:stackoverflow.com/questions/8661526/…
  • "有人制作了一个游戏并将其作为 R 包发布"
  • 呸!在@BrianDiggs 和 Dason 提出的浪费时间的“有用”建议之后,我担心我的工作效率会下降,但幸运的是,RStudio 和通过终端运行的 R 都不支持交互式图形。

标签: r package


【解决方案1】:

这可能是一种方法。我创建了一个带有虚拟函数的虚拟包(我创建的任何函数都必然是一个虚拟函数)和一个我称为scores 的数据集,我设置如下:

scores <- NA

然后我用分数数据集创建了包。

然后我使用以下内容从 R 中更改数据集。

loc <- paste0(find.package("new"), "/Data")
unlink(paste0(loc, "/scores.rda"), recursive = TRUE, force = FALSE)
scores <- 10

save(scores, file=paste0(loc, "/scores.rda"))

然后当我卸载库并重新加载时,数据集现在显示:

> scores
[1] 10

这可以修改为你想要的吗?您必须以某种方式将其保存在两者之间,但不确定如何在不弄乱.Last 函数的情况下做到这一点。

编辑:

看来此选项不可行,因为当您编译为包并使用延迟加载时,它会将数据集保存为:

RData.rbd、RData.rbx,不是 .rda 文件。这意味着我上面使用的方法有点毫无价值,因为我们希望它能够被自动识别。

EDIT2 这种方法有效,我在我制作的包上进行了尝试。您不能对数据进行延迟加载,您必须在您正在调用的函数内显式使用 data(scores) 或使用 data(scores)。我还将scores 分配给.scores int he global.env 第一次创建并在函数内部使用exists 以查看它是否存在。如果`.scores。存在我将其分配给函数内的分数。卸载库并再次加载后,您就不必再担心了。

也许另一种方法是将其保存为一个函数,可以在这里使用 Josh 的建议进行更改:Permanently replacing a function

【讨论】:

  • 您对.onUnload 有何看法?我还没有尝试过,但它应该在 R 关闭时为所有包运行,对吧?
  • 您可以在修改scores 的任何时候重新保存它(假设不是很频繁)。那么你就不必担心“最后”保存它
  • 我将不得不玩弄它,但这似乎会做我想要的。
  • 我不明白为什么这种方法毫无价值。我看不出有什么理由需要延迟加载数据。
  • 怎么不 dason 或者你让函数加载数据?
【解决方案2】:

我想如果不以某种方式将设置保存到磁盘或数据库,就无法存储设置。它可以通过将下面的代码放在您的~/.Rprofile 中静默完成。但是,如果您有使用 options 以外的其他方式保存设置的包,则需要手动添加它们。

我知道这正是你所说的你不想要的,但它至少可能会引发一些争论。

.Last <- function(){
    my.options <- options()
    save(my.options, file="~/.Roptions.Rdata")
}

.First <- function(){
    tryCatch({
        load("~/.Roptions.Rdata")
        do.call(options, my.options)
        rm(my.options)
    }, error=function(...){})
}

令我惊讶的是,如果~/.Roptions.Rdata 不存在,try(..., silent=TRUE) 在启动时会发出警告,这就是我改用tryCatch 的原因。

【讨论】:

  • 关于如何在不要求用户修改其 .Rprofile 的情况下执行此操作的任何想法?
  • 你可以为它制作一个包并将上面的代码放在.onLoad().onUnload()zzz.R,但是你每次启动R时仍然需要加载那个包。
【解决方案3】:

https://blog.r-hub.io/2020/03/12/user-preferences/ 很好地解释了这个问题的现代答案

我想我会尝试囤积包!这是一个对我有用的例子:)

x <- hoardr::hoard()
x$cache_path_set("yourpackage", type = 'user_cache_dir')
x$mkdir()

scores<-data.frame(
  user=c("one","two","three"),
  score=c("500,200,1100")
  )
save(scores,file = file.path(x$cache_path_get(), "scores.rdata"))

x$list()
x$details()

#new session
x <- hoardr::hoard()
x$cache_path_set("yourpackage", type = 'user_cache_dir')
x$list()
x$details()
load(file = file.path(x$cache_path_get(), "scores.rdata"))

PS - 您可以在 github“opensci/rnoaa”上的 rnoaa 包中看到一个工作示例。检查他们的 R/onload.r 文件!如果需要,我可以扩展。

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2014-12-17
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多