在 R 中,将一个函数作为输入传递给另一个函数时进行参数检查

问题描述 投票:0回答:1

在 R 中,如果我将一个函数作为输入传递给另一个函数(如stackoverflow.com/questions/74044185),我如何参数检查该函数?作为一个最小的示例,此函数要求传递的函数为 NULL(不执行任何操作)、upper.tri 或 lower.tri

mytri <- function(tri.func = NULL){
  test <- matrix(1:25,5,5)
  if(is.function(tri.func)){
     test[!tri.func(test)] <-NA
  }
  return(test)
}
mytri()
mytri(upper.tri)
mytri(lower.tri)

但是我如何检查该函数是否在我的允许列表中?例如

mytri(log)
将返回错误的结果,但不会出现错误。我尝试了
if(is.function(tri.func) && all(names(formals(tri.func)) ==c("x","diag")))
但这不起作用,因为显然
all(logical(0) == c("x", "diag"))
TRUE

r function validation
1个回答
1
投票

就像我在对这个问题的评论中所说的那样,

match.arg
中的第一个例子可以适应这个问题。主要的转折是可能缺少参数,即问题中的
NULL
默认值。这里我用
missing
测试一下。

mytri <- function(tri.func = c("upper.tri", "lower.tri")) {
  test <- matrix(1:25, 5, 5)
  if(!missing(tri.func)) {
    tri.func <- match.arg(tri.func)
    i <- switch(tri.func,
                upper.tri = upper.tri(test),
                lower.tri = lower.tri(test))
    test[i] <- NA
  }
  test
}

mytri()
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    1    6   11   16   21
#> [2,]    2    7   12   17   22
#> [3,]    3    8   13   18   23
#> [4,]    4    9   14   19   24
#> [5,]    5   10   15   20   25
mytri("upper.tri")
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    1   NA   NA   NA   NA
#> [2,]    2    7   NA   NA   NA
#> [3,]    3    8   13   NA   NA
#> [4,]    4    9   14   19   NA
#> [5,]    5   10   15   20   25
mytri("lower.tri")
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    1    6   11   16   21
#> [2,]   NA    7   12   17   22
#> [3,]   NA   NA   13   18   23
#> [4,]   NA   NA   NA   19   24
#> [5,]   NA   NA   NA   NA   25
mytri("log")
#> Error in match.arg(tri.func): 'arg' should be one of "upper.tri", "lower.tri"

创建于 2024-05-02,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.