如何编写缓存变量求值程序?

时间:2012-10-26 11:53:27

标签: r

编辑:

我有一段看起来像这样的kludgy代码:

readcsvfile()
dopreprocessingoncsvfile()
readanothercsvfile()
moreprocessing()
# etc ...

过了几天,这已经逐渐变得越来越复杂,因此现在需要花费一两分钟的时间来运行,而且我不是很耐心:-P。鉴于R在保存环境方面非常出色,我的意思是R环境中的变量,加速它的一个简单方法是:

if( !exists("init.done") {
readcsvfile()
dopreprocessingoncsvfile()
readanothercsvfile()
moreprocessing()
init.done = T
}

然而,我喜欢它更细粒度,尤其是因为有时我可能会在处理中调整一个函数,所以我想重新运行它,而不是看着整个世界重新加载,所以我已经改变了它到:

if( !exists("somedata" ) ) {
    somedata <- readcsvfile()
}
# ... etc ... same for the others

然而,有时我会犯下列错误之一,让我们面对它,我也只是懒惰,所以如果有更简洁的方法,为什么要写一个很长的if语句呢?我经常犯下以下错误:

  • 错误输入if中变量的名称,我通过注意每次运行脚本时都会继续运行来“检测”自身
  • 错过if子句中的第二个括号,需要10-15秒才能检测,修改和重新运行,这很烦人:-P

Sooo ....我的提议解决方案是编写一个函数cacheVar,其定义看起来有点像:

cacheVar <- function( varname, expression ) {
    if( !exists(varname ) {
        setValueMagic( varname, evalMagic(expression) )
    }
}

... and whose usage looks like:

cacheVar("foo", {
    # some expression that calculates the value of foo
})

...仅当值'varname'尚不存在时才计算表达式。

我想缺少的信息是:

  • 这已经存在吗?
  • 如何在R?
  • 中编写setValueMagic
  • 如何在R?
  • 中编写evalMagic

编辑:有点复杂,因为我们需要分配到父框架,可能使用parent.envparent.frame,就像这样。

0 个答案:

没有答案