R语言:在sapply中使用ls(pattern=...)无法匹配对象的问题求助
问题解决:sapply中ls()返回空向量的原因与修复
别担心,这个问题我之前也踩过坑,核心原因是R的环境作用域机制在搞鬼:
sapply里的匿名函数会运行在自己的局部环境中,而默认情况下ls()只会搜索当前函数的环境,你的A_1、A_2这些变量都存在全局环境(.GlobalEnv)里,所以函数内部的ls()自然找不到它们。
快速修复方案
只需要在ls()里指定搜索的环境为全局环境就行,加上envir = .GlobalEnv参数:
rm(list=ls()) A_1 <- letters[1] A_2 <- letters[1] A_3 <- letters[1] B_1 <- letters[1] B_2 <- letters[1] B_3 <- letters[1] N <- c(1, 2) # 修复后的代码 sapply(N, function(i) ls(pattern=paste0("A_", i), envir = .GlobalEnv)) # 输出结果: # [[1]] # [1] "A_1" # [[2]] # [1] "A_2"
更规范的做法(推荐)
其实直接在全局环境里零散命名变量再用ls()查找,并不是R的最佳实践。更清晰的方式是把相关变量放进列表里统一管理,这样不仅避免环境问题,代码可读性也更高:
# 把A系列变量放进列表 A_list <- list( A_1 = letters[1], A_2 = letters[1], A_3 = letters[1] ) B_list <- list( B_1 = letters[1], B_2 = letters[1], B_3 = letters[1] ) N <- c(1,2) # 直接从列表中提取对应元素 sapply(N, function(i) A_list[[paste0("A_", i)]]) # 或者更简洁的写法 A_list[paste0("A_", N)]
这样操作起来更直接,也不会再碰到环境相关的奇怪问题啦~
内容的提问来源于stack exchange,提问作者CPak
相关产品推荐
相关产品推荐

