【发布时间】:2014-08-14 20:49:30
【问题描述】:
我在下面的 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
这是我面临的问题的可重现示例。由于某种原因,do.call & 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("pur_1", "pur_2")[[1L]], ...) 中的错误:找不到对象 'pur_1'
更新 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
>
【问题讨论】: