eval是否有更高效/干净的方法(解析(paste0)(设置?

时间:2013-08-29 18:18:22

标签: r get eval

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

示例:

dataset <- "dataRef"

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

但现在想象一下这样一种场景,其中dataRef将被调用1000行代码,有时需要更改为dataRef2或dataRefX。

2 个答案:

答案 0 :(得分: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')]

或者您可以使用lapplysapply或循环一次处理所有内容:

mydfs2 <- lapply( mydfs, function(x) x[,c('column1','column2')] )

答案 1 :(得分:3)

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

 newname <- "newdf"

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

要学习的课程是assignget能够获取字符字符值,以及访问或创建可以是数据对象或函数的命名对象。 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`