R - 如何创建一个接受代码块作为参数的函数?

时间:2013-08-14 12:44:16

标签: r

我想创建一个接受代码块作为参数的函数。我不知道如何在R中执行此操作。我想创建一个与 函数内置的 具有相似行为的函数。

data <- within(data, {
  var4 <- var2 + var3
  var5 <- var1 / var2
})

我无法在R源代码中找到 函数定义中的 。否则,我可能会得到答案。

由于

2 个答案:

答案 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)
}