2

编辑:

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

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”不存在时才评估表达式。

我想充实这一点的缺失信息是:

  • 这已经存在了吗?
  • 如何用setValueMagicR 写?
  • 如何用evalMagicR 写?

编辑:有点复杂,因为我们需要分配到父框架,可能使用parent.envor parent.frame,类似的东西。

4

0 回答 0