You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:45:33