我想创建一个接受代码块作为参数的函数。我不确定如何在 R 中执行此操作。我想创建一个与内置函数具有相似行为的函数。
data <- within(data, {
var4 <- var2 + var3
var5 <- var1 / var2
})
我无法在 R 源代码中找到 inside函数定义。否则,我可能会有我的答案。
谢谢
我想创建一个接受代码块作为参数的函数。我不确定如何在 R 中执行此操作。我想创建一个与内置函数具有相似行为的函数。
data <- within(data, {
var4 <- var2 + var3
var5 <- var1 / var2
})
我无法在 R 源代码中找到 inside函数定义。否则,我可能会有我的答案。
谢谢
这很简单:
test <- function(block) {
cat('before\n')
rv <- block
cat('after\n')
rv
}
看看它是如何工作的:
test_called <- test({
cat('bar\n')
'baz'
})
运行后者输出:
before
bar
after
并且test_called
有价值'baz'
这表明该块仅在您对其执行某些操作时才被评估,而不是在被传递时立即评估。
这就是我一直在寻找的。您只需将代码块(也称为表达式)传递给 eval() 函数。有关更多详细信息和变体,请参见?eval。
foo <- function(expr) {
result <- eval(expr)
return(result)
}
谢谢!
更新:为了提供一些上下文,我试图创建一个函数来执行一个长时间运行的表达式,然后缓存(也就是保存)结果,这样它就不需要重新运行了。这是我最终创建的简化版本。我愿意接受有关如何更好地做到这一点的建议。
cache <- function (cache.name, expr) {
result <- NULL
cache.file <- sprintf ("%s/%s.rds", cache.dir, cache.name)
# has the result already been cached?
if (file.exists (cache.file)) {
result <- readRDS(cache.file)
} else {
# eval the expression
result <- eval(expr)
# cache the result
saveRDS (result, cache.file, compress = cache.compress)
}
return(result)
}