Выполнить код после `UseMethod ()` в универсальной функции в R? - PullRequest
0 голосов
/ 22 мая 2019

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

  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”)
}

1 Ответ

0 голосов
/ 22 мая 2019

В зависимости от того, чего вы хотите достичь, это может быть осуществимо с помощью команды 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 не возвращает).Возможный обходной путь может заключаться в принудительном вводе среды в вызываемый метод для сохранения результатов в.

...