就像我在评论中所说的那样, 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"
Created on 2024-05-02 with reprex v2.1.0
编辑
回答评论
但我并没有寻找其他方法来获得相同的结果。原则上,在不更改任何其他代码的情况下,是否可以将任何逻辑检查添加到我的问题中的 if 语句中?
这是添加了逻辑测试的版本。新测试是一系列 identical
检查,因为 %in%
和 ==
不适用于函数对象。
当该函数不是允许的函数之一时,将引发可用 try
或 tryCatch
捕获的错误。
mytri <- function(tri.func = NULL) {
test <- matrix(1:25,5,5)
if(is.function(tri.func) &&
(identical(tri.func, lower.tri) || identical(tri.func, upper.tri))) {
test[!tri.func(test)] <-NA
} else if(!is.null(tri.func)) {
f <- deparse(substitute(tri.func))
msg <- sprintf("'%s' not an allowed function.", f)
stop(msg)
}
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,] NA 6 11 16 21
#> [2,] NA NA 12 17 22
#> [3,] NA NA NA 18 23
#> [4,] NA NA NA NA 24
#> [5,] NA NA NA NA NA
mytri(lower.tri)
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] NA NA NA NA NA
#> [2,] 2 NA NA NA NA
#> [3,] 3 8 NA NA NA
#> [4,] 4 9 14 NA NA
#> [5,] 5 10 15 20 NA
mytri(log)
#> Error in mytri(log): 'log' not an allowed function.
Created on 2024-05-02 with reprex v2.1.0