R函数内通配符操作失效:无法合并数据框及删除对象的原因?
函数问题的核心原因
- 作用域匹配错误:函数内部调用
ls()时,默认扫描的是函数自身的局部环境,但你用<<-创建的hi_1、hi_2、hi_3被存储在全局环境中,导致grep无法捕获这些对象名,最终nameswant为空,dfwant自然是空白数据框。 - 删除操作的环境偏差:
rm()默认操作当前函数的局部环境,全局环境中的hi_*不在其扫描范围内,所以执行后全局的单个数据框根本没被删除。 - 对象查找的环境默认值问题:即便
nameswant能拿到全局对象名,get()默认也只会在函数局部环境查找,无法获取全局的hi_*对象。
修正方案(指定环境)
library(plyr) func <- function() { # 明确指向全局环境 global_env <- globalenv() df <- data.frame(matrix(rnorm(16), 1)) hi_1 <<- df df <- data.frame(matrix(rnorm(16), 1)) hi_2 <<- df df <- data.frame(matrix(rnorm(16), 1)) hi_3 <<- df # ls指定扫描全局环境 nameswant <<- grep('hi_', ls(envir = global_env), value = TRUE) # get时指定从全局环境取对象 dfwant <<- ldply(nameswant, function(x) get(x, envir = global_env)) # rm指定操作全局环境 rm(list = ls(pattern = glob2rx("hi_*"), envir = global_env), envir = global_env) } func()
更优实现(避免全局变量)
尽量不要用<<-修改全局环境,直接在函数内部生成数据框列表,更符合R的函数设计规范:
library(plyr) func <- function() { # 直接生成3个数据框组成的列表 df_list <- lapply(1:3, function(x) data.frame(matrix(rnorm(16), 1))) # 合并为单个数据框 dfwant <- ldply(df_list) return(dfwant) } # 调用函数获取结果 result <- func()
内容的提问来源于stack exchange,提问作者pakalla
相关产品推荐
相关产品推荐

