正如我在对这个问题的 comments 中所说,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年5月2日,共有reprex v2.1.0个
Edit
回复 comments
但我并没有寻找替代方法来获得同样的结果.原则上,在不更改任何其他代码的情况下,是否有任何逻辑判断可以添加到我的问题中的if陈述中?
here is a version with an added logical test. The new test is a series of identical
checks because %in%
and ==
do not work with function objects.
When the function is not one of the allowed functions an error trappable with try
or tryCatch
is thrown.
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.
创建于2024年5月2日,共有reprex v2.1.0个