1

我想要以下通用功能,

  1. 检查这些 allowedFormats (这有效),
  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”)
}

4

2 回答 2

0

根据您希望实现的目标,使用“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不会返回)。一种可能的解决方法是强制将环境馈送到被调用的方法中,以存储结果。

于 2019-05-22T10:19:40.860 回答
0

定义和调用嵌套泛型

> validate <- function (x, allowedFormats) {
+     .validate <- function(x, allowedFormats) {
+         UseMethod("validate", x)
+     }
+     # Check arguments ---------------------------------------------------------
+     # ...
+     .validate(x, allowedFormats)
+     cat("Validation completed")
+ }
> validate.numeric <- function(x, allowedFormats) {
+     cat('Working...\n')
+ }
> validate(5, NA)
Working...
Validation completed
于 2021-10-14T15:20:32.557 回答