编辑:
我有一段看起来像这样的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语句呢?我经常犯下以下错误:
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'尚不存在时才计算表达式。
我想缺少的信息是:
setValueMagic
evalMagic
编辑:有点复杂,因为我们需要分配到父框架,可能使用parent.env
或parent.frame
,就像这样。