R语言技术问询:如何将integer(0)转为Null、限制d长度为1并校验d合法性
解决你的两个R编程问题
问题1:让which()返回NULL而非integer(0)
当which()找不到符合条件的元素时,默认会返回空的整数向量integer(0)。要改成返回NULL,只需要在拿到which()的结果后,判断它的长度是否为0,如果是就返回NULL即可。
这里给你写一个封装好的函数示例:
find_divisible_pos <- function(x, d) { # 先用which找到所有取余为0的位置 matching_pos <- which(x %% d == 0) # 如果没有匹配项,返回NULL;否则返回位置向量 if (length(matching_pos) == 0) { return(NULL) } else { return(matching_pos) } } # 测试一下效果 test_vector <- c(2, 5, 7, 10) find_divisible_pos(test_vector, 3) # 没有能被3整除的元素,返回NULL find_divisible_pos(test_vector, 2) # 返回c(1,4),对应2和10的位置
问题2:校验参数d的合法性
要确保参数d是单个数值,我们可以在函数开头加入校验逻辑:
- 用
is.numeric(d)检查d是否为数值类型 - 用
length(d) == 1检查d的长度是否为1
只要其中一个条件不满足,就用stop()函数抛出警告并终止函数运行。
把校验逻辑加入刚才的函数,完善后如下:
find_divisible_pos <- function(x, d) { # 第一步:校验参数d if (!is.numeric(d)) { stop("错误:参数d必须是数值类型!") } if (length(d) != 1) { stop("错误:参数d的长度必须为1!") } # 第二步:查找符合条件的位置并处理返回值 matching_pos <- which(x %% d == 0) if (length(matching_pos) == 0) { return(NULL) } else { return(matching_pos) } } # 测试错误场景 find_divisible_pos(test_vector, c(2,3)) # 长度不为1,触发错误 find_divisible_pos(test_vector, "abc") # 不是数值类型,触发错误
额外小提示
如果你觉得写两个if判断有点繁琐,也可以用stopifnot()函数一次性校验多个条件,代码会更简洁:
find_divisible_pos <- function(x, d) { # 用stopifnot一次性校验多个条件 stopifnot( "参数d必须是数值类型!" = is.numeric(d), "参数d的长度必须为1!" = length(d) == 1 ) matching_pos <- which(x %% d == 0) return(ifelse(length(matching_pos) == 0, NULL, matching_pos)) }
stopifnot()会在条件不满足时,抛出你指定的错误信息,非常适合做参数校验。
内容的提问来源于stack exchange,提问作者Donnel Cooperman
相关产品推荐
相关产品推荐

