是否有明确的方法来保存会话之间某个包的选项或信息?
比如说有人制作了游戏并将其作为R包发布。如果他们想要保存高分并且每次R开始新会话时没有重置它们,那么最好的方法是什么?目前我只能想到将文件存储在用户主目录中,但我不确定我是否喜欢这种方法。
答案 0 :(得分:4)
这可能是一种方法。我创建了一个带有虚函数的虚拟包(我创建的任何函数都必须是一个虚函数)和一个我称之为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"))
然后当我卸载库并重新加载agin时,数据集现在说:
> scores
[1] 10
可以修改它来做你想要的吗?你必须以某种方式保存它,但不确定如何在不弄乱.Last
函数的情况下执行此操作。
修改强>
看来此选项不可行,因为当您作为包编译并使用延迟加载时,它会将数据集保存为:
RData.rbd,RData.rbx,而不是.rda文件。这意味着我上面使用的方法有点毫无价值,因为我们希望它能够被自动识别。
<强> EDIT2 强>
这种方法有效,我在我制作的包装上尝试过。您无法对数据进行延迟加载,您必须在您正在调用的函数内明确使用data(scores)
或使用data(scores)
。我还在第一次创建global.env时将scores
分配给.scores
int并在函数内部使用exists
来查看它是否存在。如果`.scores。我已将此分配给该功能内的分数。一旦你卸载了库并重新开始工作,你再也不用担心了。
也许另一种方法是将此保存为某种功能,可以使用Josh的建议进行更改:Permanently replacing a function
答案 1 :(得分:1)
我想没有办法存储设置而不用某种方式将它们保存到磁盘或数据库。通过将下面的代码放在~/.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
的原因。