是否有明确的方法可以在会话之间保存与某个包有关的选项或信息?
例如,假设有人制作了一款游戏并将其作为 R 包发布。如果他们想保存高分而不是每次 R 开始新会话时都重置它们,那么最好的方法是什么?目前我只能考虑在用户主目录中存储一个文件,但我不确定我是否喜欢这种方法。
这可能是一种方法。我创建了一个带有虚拟函数的虚拟包(我创建的任何函数都必然是一个虚拟函数)和一个我调用的数据集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)
在您正在调用的函数内部使用。我还在第一次创建 global.env 时将其分配scores
给它,并在函数内部使用它来查看它是否存在。如果`.scores。存在我将其分配给函数内的分数。一旦你卸载库并再次加载,你就不必再担心了。.scores
exists
也许另一种方法是将其保存为一个函数,可以在这里使用 Josh 的建议进行更改:Permanently replace a function
我想如果不以某种方式将设置保存到磁盘或数据库,就无法存储设置。可以通过将下面的代码放入您的~/.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(...){})
}
令我惊讶的是,如果不存在,try(..., silent=TRUE)
则会在启动时发出警告,这就是我改用的原因。~/.Roptions.Rdata
tryCatch