在 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
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