2013-01-10 54 views
1

我有以下情況,我很絕望。用於data.frames然後concat data.frames的評估列表字符串

paste("crossdata","$geno$'",1:4,"'$data",sep="") 

產生4串看起來像:

"crossdata$geno$'1'$data" "crossdata$geno$'2'$data" "crossdata$geno$'3'$data" "crossdata$geno$'4'$data" 

我想通過這些字符串的一個評價檢索這些4個字符串的相應data.frames並通過cbind的將它們結合起來。然而,當我做這樣的事情:

cbind(sapply(parse(text=paste("crossdata","$geno$'",i,"'$data",sep="")),eval)) 

不起作用。有人可以幫我嗎? 感謝

+1

'庫(財富);財富(106)' – Roland

+1

和財富(312) –

回答

1
datlist <- list(adat=data.frame(u=1:5,v=6:10),bdat=data.frame(x=11:15,y=16:20)) 

extdat <- c("datlist$adat","datlist$bdat") 

do.call('cbind',lapply(extdat,function(i) eval(parse(text=i)))) 

    u v x y 
1 1 6 11 16 
2 2 7 12 17 
3 3 8 13 18 
4 4 9 14 19 
5 5 10 15 20 

當然,這使用eval + parse,這通常意味着你是在錯誤的軌道上。

+0

哇,這正是我所需要的。非常感謝。嗯,最後它並不那麼難。再次感謝。 –

1

使用的parseeval組合好像是在說,你知道如何從紐約到波士頓,因此通過從原點到紐約去使您的旅行計劃,然後去波士頓,然後到你的輸出地址。在某些情況下,這可能並不壞,但如果您從倫敦到巴黎旅行,則有點長途迂迴。

你應該使用$[[先學會子集列表之間的聯繫和區別(見?'[['的文檔),當它是更重要的,是不恰當的使用$。一旦你明白你應該能夠找到不需要parseeval的解決方案。

(因爲你的例子是不可重現未經測試)你的問題可能是簡單的:

do.call(cbind, lapply(1:4, function(x) crossdata[['geno']][[x]][['data']])) 

或可能

do.call(cbind, lapply(as.character(1:4), function(x) crossdata$geno[[x]]$data))