有时我会根据某个变量ID引用特定数据集的代码。然后,我使用paste0
创建了代码行,然后使用eval(parse(...))
行来执行代码。随着代码长度的增加,这似乎越来越草率。有没有更简洁的方法来获得动态数据?
示例:
dataset <- "dataRef"
execute <- paste0("data.frame(", dataset, "$column1, ", dataset, "$column2)")
eval(parse(execute))
但现在想象一下这样一种场景,其中dataRef将被调用1000行代码,有时需要更改为dataRef2或dataRefX。
答案 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')]
或者您可以使用lapply
,sapply
或循环一次处理所有内容:
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) ]
要学习的课程是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`