1

我有以下情况,我非常绝望。

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))

那是行不通的。有人可以帮帮我吗?谢谢

4

2 回答 2

1

使用 和 的组合parse就像eval是在说您知道如何从纽约市到波士顿,因此通过从您的出发地到纽约,然后到波士顿,再到您的目的地来制定您的所有旅行计划。在某些情况下,这可能还不错,但如果您从伦敦到巴黎旅行,那就有点绕道而行了。

$您应该首先了解使用and的子集列表之间的关系和区别[[(请参阅?'[['文档)以及何时使用,更重要的是,不适合使用$. 一旦您了解您应该能够找到不需要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 ) )
于 2013-01-10T17:40:59.970 回答
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,这通常意味着你走错了路。

于 2013-01-10T14:03:54.153 回答