我有以下情况,我非常绝望。
paste("crossdata","$geno$'",1:4,"'$data",sep="")
生成4个字符串,如下所示:
"crossdata$geno$'1'$data" "crossdata$geno$'2'$data" "crossdata$geno$'3'$data" "crossdata$geno$'4'$data"
我想通过评估其中一个字符串并通过cbind将它们组合来检索这4个字符串的相应data.frames。但是当我做这样的事情时:
cbind(sapply(parse(text=paste("crossdata","$geno$'",i,"'$data",sep="")),eval))
不起作用。有人可以帮帮我吗? 感谢
答案 0 :(得分: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
,这通常意味着您走错了路。
答案 1 :(得分:1)
使用parse
和eval
的组合就像是说你知道如何从纽约市到达波士顿,从而制定所有旅行计划,从出发地到纽约,然后到波士顿,然后到你的desitination。在某些情况下,这可能并不坏,但如果你从伦敦到巴黎旅行,那将是一个长途跋涉。
您应首先使用$
和[[
了解子集列表之间的关系和差异(有关文档,请参阅?'[['
),何时更为重要,更重要的是,不适合使用$
。了解到您应该能够找到不需要parse
和eval
的解决方案。
您的问题可能很简单(因为您的示例无法重复,因此未经测试):
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 ) )