2

有时我的代码会根据一些变量 ID 引用特定数据集。然后我一直在使用创建代码行paste0,然后使用eval(parse(...))该行来执行代码。随着代码长度的增加,这似乎变得草率。有没有更简洁的方法来获取动态数据引用?

例子:

dataset <- "dataRef"

execute <- paste0("data.frame(", dataset, "$column1, ", dataset, "$column2)")
eval(parse(execute))

但是现在想象一个场景,其中 1000 行代码会调用 dataRef,有时需要更改为 dataRef2 或 dataRefX。

4

2 回答 2

3

结合 Jack Maney 和 G.Grothendieck 的评论:

最好将要通过变量访问的数据框存储在列表中。可以使用以下名称从名称向量创建列表get

mynames <- c('dataRef','dataRef2','dataRefX')
# or mynames <- paste0( 'dataRef', 1:10 )
mydfs <- lapply( mynames, get )

然后你的例子变成:

dataset <- 'dataRef'
mydfs[[dataset]][,c('column1','column2')]

lapply或者,您可以使用、sapply或循环一次处理它们:

mydfs2 <- lapply( mydfs, function(x) x[,c('column1','column2')] )
于 2013-08-29T19:46:30.823 回答
3

@G.Grothendieck 向您展示了如何使用get[提升字符值并返回命名对象的值,然后引用该对象中的命名元素。我不知道您的代码打算完成什么,因为执行 htat 代码的结果是将值传递到控制台,但它们不会被分配给名称并且会被垃圾收集。如果您想使用三个字符值:objname、colname1 和 colname2,并且这些列等于以第四个字符值命名的对象。

 newname <- "newdf"

 assign( newname, get(dataset)[ c(colname1, colname2) ]

要学习的课程是assign并且get能够获取字符字符值并访问或创建可以是数据对象或函数的命名对象。Carl_Witthoft 提到 do.call 可以从字符值构造函数调用。

do.call("data.frame", setNames(list( dfrm$x,  dfrm$y), c('x2','y2') )

 do.call("mean", dfrm[1]) 
# second argument must be a list of arguments to `mean`
于 2013-08-29T19:49:31.090 回答