Нестандартная оценка выражений в контексте S4
Это заимствовано из блестящей функции exprToFunction
который используется в их reactive
функция.
Актуальный вопрос
Как я могу отложить оценку выражения (например, указывается через arg expr
) чтобы "захватить" его содержимое при вызове метода S4 (в отличие от стандартной функции R)?
пример
Обратите внимание, что x_1
пока не существует, поэтому мы хотим отложить оценку expr
и просто "захватить" его содержание.
функция captureExpression
:
captureExpression <- function(
expr,
caller_offset = 1,
brackets = TRUE
) {
out <- eval(substitute(substitute(expr)), parent.frame(caller_offset))
if (brackets && class(out) != "{") {
out <- substitute({CODE}, list(CODE = out))
}
out
}
captureExpression(x_1 * 2)
# {
# x_1 * 2
# }
Проходя без оценки expr
сквозной работает при вызове стандартной функции R:
foo <- function(expr) {
captureExpression(expr = expr)
}
foo(x_1 * 2)
# {
# x_1 * 2
# }
Проходя без оценки expr
сквозной не работает при вызове метода S4:
setGeneric(
name = "bar",
signature = c(
"expr"
),
def = function(
expr,
...
) {
standardGeneric("bar")
}
)
setMethod(
f = "bar",
signature = signature(
expr = "ANY"
),
definition = function(
expr,
...
) {
captureExpression(expr = expr, ...)
})
Применяя метод S4:
bar(x_1 * 2)
# Error in bar(x_1 * 2) :
# error in evaluating the argument 'expr' in selecting a method for function 'bar': Error:
# object 'x_1' not found
bar(x_1 * 2, caller_offset = 2)
# Error in bar(x_1 * 2, caller_offset = 2) :
# error in evaluating the argument 'expr' in selecting a method for function 'bar': Error:
# object 'x_1' not found
bar(x_1 * 2, caller_offset = 3)
# Error in bar(x_1 * 2, caller_offset = 3) :
# error in evaluating the argument 'expr' in selecting a method for function 'bar': Error:
# object 'x_1' not found
Я предполагаю, что это связано с тем, как на самом деле осуществляется диспетчеризация метода. Однако, может быть, есть способ, которым это можно сделать в любом случае.