5

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

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

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

谢谢

4

2 回答 2

8

这很简单:

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'

这表明该块仅在您对其执行某些操作时才被评估,而不是在被传递时立即评估。

于 2015-03-05T08:49:50.587 回答
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)
}
于 2013-08-14T13:07:44.460 回答