【发布时间】:2014-08-21 22:01:08
【问题描述】:
是否存在 R 包可以存储缓存数据的预定义位置?数据应该跨会话持续存在。我正在考虑创建${R_LIBS_USER}/package_name 的子目录,但我不确定这是否是可移植的,如果我的包安装在系统范围内,是否“允许”。
思路如下:在包的data子目录下创建一个R脚本mydata.R,通过调用data(mydata)来执行(根据data()的文档)。如果之前没有缓存过,此脚本将从 Internet 加载数据并缓存它。 (如果数据已经被缓存,将使用缓存。)此外,将提供一个函数来使缓存无效和/或检查是否有更新版本的数据在线可用。
这是来自data()的文档:
目前支持四种格式的数据文件:
以“.R”或“.r”结尾的文件是 source()d 的,R 工作目录临时更改为包含相应文件的目录。 (数据确保 utils 包已附加,以防它通过 utils::data 运行。)
...
确实,在一个包的data子目录中创建一个文件fortytwo.R,内容如下:
fortytwo = data.frame(answer=42)
然后执行data(fortytwo)会创建一个数据框变量fortytwo。现在的问题是:如果数据难以计算,fortytwo.R 会将数据缓存在哪里?
编辑:我正在考虑创建两个包:提供数据的“数据”包和对其进行操作的“代码”包。问题与“数据”包有关:它可以将文件存储在每个用户的存储空间中的什么位置,以便在 R 会话中持久保存并可以从不同的 R 项目中访问?
相关:Package that downloads data from the internet during installation.
【问题讨论】:
-
您可能想看看github.com/hadley/rappdirs - 它是 AppDirs 的一个端口,它是一个尝试以特定于操作系统的方式查找正确目录的 python 库。
-
只是想澄清一下:你的意思是数据在被 R 脚本处理后可以存储在哪里?换句话说,您的问题真的是关于数据包中的数据,还是作为已发生的任何处理的输出生成的数据? 听起来像后者。
-
@hadley:这有没有可能很快出现在 CRAN 上?如果没有特定于 R 的方法来执行此操作(例如将其放入 `${R_USER_LIBS} 的子目录中),我将很乐意使用您的包。
-
@AnandaMahto:我想象以下工作流程: 1.代码包加载数据包,并调用
data(mydata)。 2. 数据包中的data/mydata.R如果数据已经下载,则在缓存中查找。如果没有,它会下载数据,对其进行整形并将其放入缓存中。无论哪种方式,重整后的数据都会加载到当前的 R 环境中。 3. 代码包使用数据包中的数据做一些花哨的事情。 -
@krlmlr 目前正在从事其他项目,因此不会在不久的将来。但是如果它通过了 R CMD 检查,如果你在几个平台上尝试过,提交可能没什么大不了的