我正在寻找一种方法来引用传递给函数的参数(考虑、 或 的substitute()
行为)ggplot2
,aes()
但有条件地这样做 - 仅当尚未用.subset()
data.table
[
quote()
这是因为我想轻松链接函数,这些函数不会假设参数是否先前被引用 - 而是根据需要替换它。
几个问题:
- 为什么这是个坏主意?
- 是否已经有任何内置方法可以实现这一目标?
- 这
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))