在R语言中如何对作为参数传入的函数进行合法性校验?
R语言函数参数合法性校验:限制传入特定函数
当需要限制函数参数只能是指定的几个函数(或NULL)时,可以通过以下两种可靠方法实现校验:
方法一:直接比对函数对象
利用R中函数是对象的特性,用identical()判断传入的函数是否属于允许的列表,这是最直接准确的方式。
mytri <- function(tri.func = NULL){ # 定义允许的参数选项 allowed_options <- list(NULL, upper.tri, lower.tri) # 校验参数合法性 valid <- any(sapply(allowed_options, function(opt) identical(tri.func, opt))) if (!valid) { stop("tri.func 仅支持传入 NULL、upper.tri 或 lower.tri") } test <- matrix(1:25, 5, 5) if (is.function(tri.func)) { test[!tri.func(test)] <- NA } return(test) }
方法二:校验函数名+形式参数
如果需要同时校验函数的参数结构,可结合函数名称和形式参数的检查,避免传入同名但参数不符的自定义函数:
mytri <- function(tri.func = NULL){ if (is.function(tri.func)) { # 获取传入函数的名称 func_name <- as.character(substitute(tri.func)) # 校验函数名是否在允许列表内 if (!func_name %in% c("upper.tri", "lower.tri")) { stop("tri.func 仅支持传入 NULL、upper.tri 或 lower.tri") } # 校验形式参数的数量和名称 func_formals <- names(formals(tri.func)) if (length(func_formals) != 2 || !all(func_formals == c("x", "diag"))) { stop("tri.func 必须包含且仅包含参数 x 和 diag") } } else if (!is.null(tri.func)) { # 非函数且非NULL的情况直接报错 stop("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)均正常返回处理后的矩阵。 - 非法调用:传入
log或其他不符合要求的函数时,会立即抛出明确的错误提示,避免生成错误结果。
内容的提问来源于stack exchange,提问作者moreQthanA
相关产品推荐
相关产品推荐

