编辑:
我有一段看起来像这样的笨拙的代码:
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”不存在时才评估表达式。
我想充实这一点的缺失信息是:
- 这已经存在了吗?
- 如何用
setValueMagic
R 写? - 如何用
evalMagic
R 写?
编辑:有点复杂,因为我们需要分配到父框架,可能使用parent.env
or parent.frame
,类似的东西。