为什么我必须在R中使用assign()而不是eval(parse(text =()))

时间:2013-05-29 09:49:03

标签: r loops assign

当我想使用循环为多个数据帧分配新值时,会出现问题。

我知道正确的方法是

for (df.name in c('df1', 'df2', 'df3')) {
  assign(df, new.value)
}

我的问题是,为什么我不能这样做

for (df.name in c('df1', 'df2', 'df3')) {
  eval(parse(text=df.name)) <- new.value
}

谢谢!

1 个答案:

答案 0 :(得分:5)

您可以使用eval / parse:

eval(parse(text= paste(df.name, "<- new.value")))

您收到的错误,

  

赋值目标扩展为非语言对象

是因为eval(parse(text=df.name))返回变量df1,而不是要评估的R表达式。


请记住,eval / parse是黑暗,危险,魔法导致无法维护的僵尸代码。如果您可以找到另一种编写代码的方法,请选择相反的方式。


如评论中所述,如果您有多个具有相似属性的数据框,则通常可以更轻松地将它们作为列表使用。

df_list <- list(df1 = df1, df2 = df2, df3 = df3)

然后,您可以使用lapply来操纵循环中的每个数据框,或使用rbinddplyr::bind_rows将它们合并为一个数据框。