在会话之间保存包设置

时间:2012-08-06 19:09:47

标签: r package

是否有明确的方法来保存会话之间某个包的选项或信息?

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

2 个答案:

答案 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的原因。