R语言自定义函数返回空数据框 函数外相同代码运行正常问题排查
问题根因
函数内的ls()没有指定搜索环境,默认只会查找函数自身的执行环境里的对象。你定义的offers_2022_05、offers_2022_06都在全局环境中,函数内部只有传入的prefix参数,自然匹配不到符合命名规则的对象,拿到空的对象向量后,最终输出就是空数据框。
你在全局环境直接运行代码时,ls()默认搜索全局环境,所以能正常拿到目标对象完成合并。
修复方法
给ls()也显式指定搜索环境为全局环境,和后续mget的搜索范围保持一致即可。修复后的可运行代码:
# 需提前加载dplyr,否则无法调用bind_rows library(dplyr) offers_2022_05 <- data.frame(x = 3) offers_2022_06 <- data.frame(x = 6) bind_multiple_dates <- function(prefix) { objects <- ls( pattern = sprintf("%s_[0-9]{4}_[0-9]{2}", prefix), envir = .GlobalEnv ) res <- bind_rows(mget(objects, envir = .GlobalEnv), .id = "month") return(res) } # 调用测试 bind_multiple_dates("offers")
运行后正常输出:
month x 1 offers_2022_05 3 2 offers_2022_06 6
优化建议
可以给函数增加自定义搜索环境的参数,同时增加匹配为空的异常提示,避免静默返回空结果不好排查问题:
bind_multiple_dates <- function(prefix, search_env = .GlobalEnv) { obj_names <- ls( pattern = sprintf("%s_[0-9]{4}_[0-9]{2}", prefix), envir = search_env ) if (length(obj_names) == 0) { stop("未找到符合命名规则的对象,请检查输入前缀或搜索环境是否正确") } res <- bind_rows(mget(obj_names, envir = search_env), .id = "month") return(res) }
内容的提问来源于stack exchange,提问作者Verena W
相关产品推荐
相关产品推荐

