【问题标题】:Is there a persistent location that is always writable which can be used as data cache by a package?是否有一个始终可写的持久位置可以被包用作数据缓存?
【发布时间】:2014-08-21 22:01:08
【问题描述】:

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

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

这是来自data()的文档:

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

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

  2. ...

确实,在一个包的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 检查,如果你在几个平台上尝试过,提交可能没什么大不了的

标签: r package


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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我可以将数据以 R 的本机格式写入磁盘。我只需要找到一个 where 我可以放置它们的地方,以便其他 R 会话可以在那里找到它。
    • 就像我说的,我使用内存数据库。 H2 和 redis 很好地为我服务。
    猜你喜欢
    • 2019-08-24
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多