我想创建一个接受代码块作为参数的函数。我不知道如何在R中执行此操作。我想创建一个与 函数内置的 具有相似行为的函数。
data <- within(data, {
var4 <- var2 + var3
var5 <- var1 / var2
})
我无法在R源代码中找到 函数定义中的 。否则,我可能会得到答案。
由于
答案 0 :(得分:3)
这很简单:
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'
这表明只有在你使用它时才会对块进行评估,而不是在传递时立即进行评估。
答案 1 :(得分:-1)
这就是我要找的东西。您只需将代码块(也称为表达式)传递给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)
}