R函数输入TRUE无返回值、FALSE正常返回的问题排查与修复
问题原因与修复方案
问题原因
你的函数存在返回值逻辑漏洞:R函数默认会返回最后一个执行的表达式的结果。
- 当
virg=FALSE时,第二个if块是函数最后执行的代码,筛选结果会被正常返回; - 当
virg=TRUE时,第一个if块执行了筛选,但后续还有一个if (virg==FALSE)的判断(虽然不生效),这个空判断成为了函数最后执行的内容,导致函数没有返回筛选后的结果,最终返回NULL。
另外,在data.table里使用which是多余的,data.table支持直接用条件筛选,不需要嵌套which。
修复方案
把两个独立的if改成if-else结构,确保无论哪个分支,筛选结果都是函数最后执行的表达式,自然会被返回;同时简化筛选逻辑:
# Create a data.table from iris iris_dt <- as.data.table(iris) select_virginica <- function(sep_l, virg) { # 先筛选指定花萼长度的记录 data_flowers <- iris_dt[Sepal.Length == sep_l] if (virg) { # 筛选virginica物种 data_flowers[Species == "virginica"] } else { # 筛选非virginica物种 data_flowers[Species != "virginica"] } }
测试验证
调用select_virginica(5.8, virg=T)会返回1条virginica记录,调用select_virginica(5.8, virg=F)返回4条非virginica记录,且都能支持后续的数据操作(比如select_virginica(5.8, T)[Petal.Length > 4.0])。
如果你习惯用明确的返回语句,也可以在每个分支里加上return(),效果完全一致:
select_virginica <- function(sep_l, virg) { data_flowers <- iris_dt[Sepal.Length == sep_l] if (virg) { return(data_flowers[Species == "virginica"]) } else { return(data_flowers[Species != "virginica"]) } }
内容的提问来源于stack exchange,提问作者Mateus Figueiredo
相关产品推荐
相关产品推荐

