我试图找到一种简单的方法来在R中使用Perl的哈希函数(本质上是缓存),因为我打算同时进行Perl样式的哈希并编写自己的计算备忘录。但是,其他人却打败了我,并准备了备忘录。挖掘的越多,我发现的就越多,例如memoise
和R.cache
,但差异尚不明确。此外,除了使用该hash
包之外,还不清楚如何获得Perl风格的哈希(或Python风格的字典)并编写自己的备忘录,这似乎并不能支撑这两个备忘录包。
由于我找不到有关CRAN或其他地方的信息来区分这些选项,因此这也许应该是关于SO的社区Wiki问题:R中用于记忆和缓存的选项是什么,它们之间有什么区别?
作为比较的基础,这是我找到的选项的列表。另外,在我看来,所有这些都依赖于哈希,因此我还要注意哈希选项。密钥/值存储在某种程度上是相关的,但是它打开了大量有关DB系统的蠕虫(例如BerkeleyDB,Redis,MemcacheDB以及许多其他蠕虫)。
看起来这些选项是:
散列
- 摘要-为任意R对象提供哈希。
记忆化
快取
- hash-提供类似于Perl的hash和Python字典的缓存功能。
键/值存储
这些是R对象的外部存储的基本选项。
检查点
- 缓存器-这似乎更类似于检查点。
- CodeDepends-一个OmegaHat项目,可作为基础
cacher
并提供一些有用的功能。 - DMTCP(不是R包)-似乎支持多种语言的检查点,并且开发人员最近寻求协助来测试R中的DMTCP检查点。
其他
- Base R支持:命名向量和列表,数据框的行和列名称以及环境中的项目名称。在我看来,使用列表有点麻烦。(也有
pairlist
,但已弃用。) - 所述data.table包支持在一个数据表元素的快速查找。
用例
尽管我对了解这些选项最感兴趣,但是我有两个基本用例:
- 缓存:简单的字符串计数。[注意:这不是用于NLP,而是用于一般用途,因此NLP库是过大的;表是不够的,因为我不想等到整个字符串集都加载到内存中后再进行操作。Perl样式的哈希值在实用程序中是正确的。]
- 记忆巨大的计算。
之所以会出现这些问题,是因为我正在研究一些简单的代码概要分析,并且我真的很想只计算简单的字符串,看看是否可以通过记忆来加快一些计算。即使我不做备忘录,也能够对输入值进行哈希处理,这会让我看看备忘录是否有帮助。
注意1:“可再生性研究的CRAN任务视图”列出了几个软件包(cacher
和R.cache
),但未详细说明用法选项。
注意2:为了帮助其他人查找相关代码,这里有一些作者或软件包的注意事项。有些作者使用SO。:)
- Dirk Eddelbuettel:
digest
-许多其他软件包都依赖于此。 - 罗杰·彭:
cacher
,filehash
,stashR
-以不同的方式,这些地址不同的问题; 有关更多软件包,请参见Roger的网站。 - Christopher Brown:
hash
-似乎是一个有用的软件包,但不幸的是,与ODG的链接断开了。 - 亨里克·本格森(Henrik Bengtsson):
R.cache
&哈德利·威克姆(Hadley Wickham):memoise
-目前尚不清楚何时偏爱另一种包装。
注意3:有些人使用备忘录/记忆,其他人使用备忘录/记忆。如果您在四处搜寻,请注意。Henrik使用“ z”,Hadley使用“ s”。