我在下面的 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()
错误信息是
FUN(c("pur_1", "pur_2")[[1L]], ...) 中的 read_date() 错误:找不到对象 '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
>