Нестандартная оценка выражений в контексте 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

Я предполагаю, что это связано с тем, как на самом деле осуществляется диспетчеризация метода. Однако, может быть, есть способ, которым это можно сделать в любом случае.

0 ответов

Другие вопросы по тегам