是否有一个始终可写的持久位置,可以用作包的数据缓存?

时间:2013-02-14 12:29:22

标签: r package

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

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

这来自data()

的文档
  

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

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

  2.   
  3. ...

  4.   

确实,在包的data()子目录中创建一个文件fortytwo.R,其中包含以下内容:

data

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

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

相关:Package that downloads data from the internet during installation

2 个答案:

答案 0 :(得分:1)

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

当用户加载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()挂钩函数中是否存在缓存对象,如果不存在,则下载数据。或者,您可以按照自己的问题中建议的方式执行此操作。

答案 1 :(得分:-3)

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

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