我在SO下面找到了这个代码行,它在函数外部作为魅力来识别数据帧列表并使用rbind加入它们。
mylist<-ls(pattern='leg_')
mleg <- do.call(rbind, lapply(mylist, get))
但是当我把它放在循环中时,我收到一条错误消息。我已尝试在函数和这些工作的各个步骤中进行故障排除,但我可能会遗漏导致此错误的内容。
for(i in 1:(length(blg_idx))){
assign(paste(deparse(substitute(leg_)),i,sep=''),l_merge(get(paste(deparse(substitute(blg)),i,sep='')),get(paste(deparse(substitute(bsg)),i,sep=''))))
}
mylist<-ls(pattern='leg_')
#return(mylist) # this returns a good list of dataframes
#mlegleg <- rbind(leg_1,leg_2) # this works
mleg <- do.call(rbind, lapply(mylist, get))
return(mleg)
} #end function read_leg
Error in FUN(c("leg_1", "leg_2")[[1L]], ...) :
object 'leg_1' not found
当我从函数返回mylist时,它能够识别所有数据帧并列出它们。当我选择在调试时返回那些时,该函数能够返回leg_1或leg_2数据帧。
[1] "leg_1" "leg_2"
任何帮助?
更新
我找到了另一个实现我需要的东西,但我确信它的效率很低,尽管我的数据帧列表最多只有4个
for(i in 1:(length(blg_idx))){
assign(paste(deparse(substitute(leg_)),i,sep=''),l_merge(get(paste(deparse(substitute(blg)),i,sep='')),get(paste(deparse(substitute(bsg)),i,sep=''))))
}
mylist<-ls(pattern='leg_')
#return(mylist)
#mlegleg <- rbind(leg_1,leg_2) # this works
# mleg <- do.call(rbind, lapply(mylist, get))
mleg <- leg_1
for(i in 2:(length(blg_idx))){
mleg <- rbind(leg,get(paste(deparse(substitute(leg_)),i,sep='')))
}
return(mleg)
} #end read_leg
更新2
这是我面临的问题的可重现的例子。出于某种原因,请做一些事情。 get无法处理为函数内生成的数据帧生成的mylist参数。
read_date <- function(x){
pur_1 <- data.frame(sku=859, X = sample(1:10),Y = sample(c("yes", "no"), 10, replace = TRUE))
pur_2 <- data.frame(sku=859, X = sample(11:20),Y = sample(c("yes", "no","na"), 10, replace = TRUE))
mylist<-ls(pattern='pur_')
pur_final <- do.call(rbind, lapply(mylist, get))
#fancier version that I want to achieve is below
#assign(paste('pur_',eval(pur_1$sku[1]),sep=''),do.call(rbind, lapply(mylist, get)))
return(pur_final)
}
read_date()
错误讯息是
read_date() FUN错误(c(&#34; pur_1&#34;,&#34; pur_2&#34;)[[1L]],...):object&#39; pur_1&#39;找不到
更新3 对于这篇文章的非常规管理,我感到很遗憾,但我的下一篇文章会更好。
这是我偶然发现的,除了我之外,对我有用。
pur_final <- do.call(rbind, mget(paste0("pur_", 1:2),envir = as.environment(-1)))
但是下一个不那么大的问题是抑制添加到数据帧的row.names。任何在此上下文中禁止row.names的建议。
> read_date()
sku X Y
pur_1.1 859 8 yes
pur_1.2 859 4 no
pur_1.3 859 3 yes
....
pur_2.8 859 14 na
pur_2.9 859 13 na
pur_2.10 859 19 no
>
答案 0 :(得分:2)
您没有可用于测试此解决方案的可重现示例,但请查看get
的帮助页面并尝试此操作:
mleg <- do.call(rbind, lapply(mylist, get, envir = globalenv() ))
答案 1 :(得分:0)
上面的答案包含您问题的关键:envir = globalenv()
我花了一段时间才意识到R将为每个功能创建一个私有环境。在这个私人环境中,你的其他变量不存在。也就是说,除非您通过使用envir
参数告诉您的函数查看全局环境。
这是一个应该将字符串作为输入,然后识别全局环境中包含其名称中的文本字符串的所有变量(例如数据帧)的函数。然后它将尝试绑定这些变量(数据框)。
如果所有变量都是具有相同列名的数据帧,则它应返回单个绑定数据帧。 myBindedDF <- mergeCompatibleTables("mypattern")
bindCompatibleTables <- function(x){
if(is.character(x)){
mylist <- grep(x, ls(pos = 1), value=T)
mergedDF <- do.call(rbind, mget(mylist,envir = as.environment(1)))
return(bindedDF)
} else {
stop("Input is not a character string")
}
}
答案 2 :(得分:0)
反应迟到,但我遇到的问题与更新2 类似,其中“找不到对象'pur_1'”。
例如,如果您想在函数中使用以下内容时,以“ pur_”开头的数据帧数量未知,则为:
mylist <- ls(pattern='pur_')
mleg <- do.call(rbind, lapply(mylist, get))
然后,您需要在函数中指向正确的环境:
mylist <- ls(pattern='pur_')
mleg <- do.call(rbind, lapply(mylist, get, env=environment()))