10

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

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

4

2 回答 2

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"))

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

> scores
[1] 10

这可以修改为你想要的吗?您必须以某种方式将其保存在两者之间,但不确定如何在不弄乱.Last功能的情况下执行此操作。

编辑:

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

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

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

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

于 2012-08-06T20:16:18.047 回答
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.RdatatryCatch

于 2012-08-06T20:01:15.313 回答