R语言函数中...参数的条件判断表达式失效问题排查
问题根因
弹出的警告就是判断逻辑写错的直接表现,也是逻辑失效的核心原因,错误点有两处:
is()函数语法使用错误:R中判断对象类型的is()标准调用格式为is(待检测对象, "目标类型名"),原代码错把判断逻辑写成is(val == 'list'),相当于先执行val == "list"的值比较操作——拿传入的列表对象和字符串"list"做相等判断,根本不是做类型校验,返回结果是和列表内部元素等长的逻辑向量,而非if()要求的单个TRUE/FALSE值。- 冗余判断:
if()本身仅接收单个逻辑值作为判断条件,额外写== TRUE属于无意义的冗余代码。
当传入的第一个列表长度大于1时,val == "list"返回的逻辑向量长度会大于1,就会触发“条件长度大于1,将仅使用第一个元素”的警告,R会强制取该向量的第一个元素(绝大多数场景为FALSE)作为判断依据,因此始终输出"no"。
修复方法
修正is()函数的参数传递逻辑,去掉错误的括号嵌套和冗余判断即可,额外补充空入参校验避免无参数传入时索引报错,修正后可运行代码如下:
testt <- function(...){ ar <- list(...) # 空入参兜底判断 if (length(ar) == 0) { print("no valid input") return(invisible(NULL)) } val <- ar[[1]] if (is(val, "list")) { print('yes') } else { print('no') } } # 功能测试 testt(list(1)) # 输出 [1] "yes" testt(123) # 输出 [1] "no" testt() # 输出 [1] "no valid input"
内容的提问来源于stack exchange,提问作者Emil11
相关产品推荐
相关产品推荐

