0

我正在寻找一种方法来引用传递给函数的参数(考虑、 或 的substitute()行为)ggplot2aes()但有条件地这样做 - 仅当尚未用.subset()data.table[quote()

这是因为我想轻松链接函数,这些函数不会假设参数是否先前被引用 - 而是根据需要替换它。

几个问题:

  1. 为什么这是个坏主意?
  2. 是否已经有任何内置方法可以实现这一目标?
  3. tryCatch部分是因为如果Promise 评估为未定义的变量,is.language则会引发错误。x还有其他/更好的解决方案吗?

我想出了什么:

substitute_c <- function(x) {
  e <- suppressWarnings(
    tryCatch({x; FALSE}, 
             error = function(e) TRUE))

  if (e || !is.language(x)) {
    substitute_q(substitute(x), env = parent.frame())
  } else {
    x
  }
}

这个怎么运作:

require(data.table)
require(dplyr)

# Example 1
fn <- function(x) substitute_c(x)
fn2 <- function(y) fn(substitute_c(y))
fn3 <- function(z) fn2(substitute_c(z))

fn(quote(a + b)
fn(a + b)
fn2(a + b)
fn3(quote(a + b))

# Example 2
dtcars <- mtcars %>% as.data.table

subset_test <- function(dt, cols) {
  cols <- substitute_c(cols)
  dt[, eval(cols)]
}

subset_test2 <- function(dt, cols) {
  cols <- substitute_c(cols)
  subset_test(dt, cols)
}

subset_test(dtcars, .(mpg, cyl))
subset_test(dtcars, list(mpg, cyl))
subset_test2(dtcars, .(mpg, cyl))
subset_test2(dtcars, list(mpg, cyl))
4

0 回答 0