Выполнить код после `UseMethod()` в универсальной функции в R?

Я хотел бы иметь следующую общую функцию, которая

  1. проверяет разрешенные форматы (это работает),
  2. чем выполняет общую функцию, основанную на типе аргумента x (работает)
  3. оценивает операторы после вызова UseMethod() (не работает - как и ожидалось)

Теперь это указано в справке для UseMethod

Любые операторы после вызова UseMethod не будут оцениваться, поскольку UseMethod не возвращает значение.

Так что это не удивительно. Но есть ли способ добиться этого, помимо определения дополнительной функции validate_after(), которая вызывает validate(), за которой следует cat(“Validation completed”)?

validate <- function (
  x,
  allowedFormats
) {

  # Check arguments ---------------------------------------------------------

  allowedFormats <- c("none", "html", "pdf", "word", "all")
  if (!(report %in% allowedFormats)) {
    stop("'report' has to be one of the following values: ", allowedFormats)
  }

  UseMethod("validate", x)

  cat(“Validation completed”)
}


person Rainer    schedule 22.05.2019    source источник


Ответы (1)


В зависимости от того, чего вы хотите достичь, это может быть возможно с помощью команды on.exit, как показано ниже:

test <- function(x, ...){
    if(!is.integer(x))
        stop("wups")
    on.exit(cat("'On exit' executes after UseMethod, but before the value is returned. x = ", x,"\n"))
    UseMethod("test")
}
test.integer <- function(x, ...){
    cat("hello i am in a function\n")
    x <- x + 3
    cat("I am done calculating. x + 3 = ",x,"\n")
    return(x)
}
test(1:3)

hello i am in a function
I am done calculating. x + 3 =  4 5 6 
'On exit' executes after UseMethod, but before the value is returned. x =  1 2 3 
[1] 4 5 6

Это не обязательно идеальное решение. Например, если кто-то хотел выполнить некоторые дополнительные вычисления с результатом метода, результат не распространяется на общую функцию (поскольку UseMethod не возвращается). Возможным обходным путем может быть принудительная передача среды в вызываемый метод для сохранения результатов.

person Oliver    schedule 22.05.2019
comment
Хорошая идея. Но я думаю, что для моей цели (для последующего отображения отчета о проверке) лучшим решением может быть использование другой функции. - person Rainer; 22.05.2019
comment
Действительно, я бы предложил то же самое. Если бы вы выпустили его как пакет, другим также было бы проще расширить ваш пакет, если универсальная функция использует общие стандарты. Большинство пакетов проверяются в теле метода. - person Oliver; 22.05.2019