16

是否存在 R 包可以存储缓存数据的预定义位置?数据应该跨会话持续存在。我正在考虑创建一个 的子目录${R_LIBS_USER}/package_name,但我不确定这是否是可移植的,以及如果我的包安装在系统范围内,这是否是“允许的”。

想法如下:在包mydata.Rdata子目录中创建一个 R 脚本,该脚本将通过调用来执行data(mydata)(根据文档data())。如果之前没有缓存过,此脚本将从 Internet 加载数据并缓存它。(如果数据已经被缓存,将使用缓存。)此外,将提供一个功能来使缓存无效和/或检查是否有更新版本的数据在线可用。

这来自以下文档data()

目前支持四种格式的数据文件:

  1. 以 '.R' 或 '.r' 结尾的文件在 source()d 中,R 工作目录临时更改为包含相应文件的目录。(数据确保 utils 包已附加,以防它通过 utils::data 运行。)

  2. ...

实际上,fortytwo.R在包的data子目录中创建一个文件,其内容如下:

fortytwo = data.frame(answer=42)

然后执行data(fortytwo)创建一个数据框变量fortytwo。现在的问题是:如果fortytwo.R数据难以计算,将在哪里缓存数据?

编辑:我正在考虑创建两个包:提供数据的“数据”包和对其进行操作的“代码”包。问题涉及“数据”包:它可以将文件存储在每个用户存储的什么位置,以便它在 R 会话中持久存在并且可以从不同的 R 项目访问?

相关:在安装过程中从 Internet 下载数据的软件包

4

2 回答 2

1

在 R 中,对于特定于包的持久缓存没有绝对定义的位置。但是,R.cache 包提供了一个用于创建和管理缓存数据的接口。看起来它可能对您的场景有用。

当用户加载 R.cache( library(R.cache)) 时,会得到如下提示:

The R.cache package needs to create a directory that will hold cache files.
It is convenient to use one in the user's home directory, because it remains
also after restarting R. Do you wish to create the '~/.Rcache/' directory? If
not, a temporary directory (/tmp/RtmpqdUcbP/.Rcache) that is specific to this
R session will be used. [Y/n]:

然后他们可以选择在他们的主目录中创建缓存目录,这可能是持久的,或者创建一个特定于会话的目录。如果你让你的数据包依赖于 R.cache,你可以在它的.onLoad()钩子函数中检查缓存对象的存在,如果不存在就下载数据。或者,您可以按照您自己的问题中建议的方式执行此操作。

于 2014-08-21T14:01:08.897 回答
-3

你看过内存数据库吗?H2 和 Redis 通过 RH2 和 rredis 在 R 中具有绑定-两者都允许您跨 r 个会话共享数据-直到创建会话处于活动状态。为了让它在非并发会话中持续存在,您需要将数据写入磁盘(假设您不能即时重新创建它 - 这会违背这个问题的目的),我相信数据包将是一个不错的选择。这样,您可以添加一个更新函数,该函数在每次加载任一包时都会初始化(即,如果代码包具有正确的依赖项)

一个例子是 RWeka 和 RWekaJars 包。在 CRAN 上查找它们,应该很容易理解它们是如何工作的。

于 2013-02-14T16:37:59.137 回答