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

Hei*_*erg 1 loops r assign

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

我知道正确的方法

for (df.name in c('df1', 'df2', 'df3')) {
  assign(df, new.value)
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Ric*_*ton 5

您可以使用eval/parse:

eval(parse(text= paste(df.name, "<- new.value")))
Run Code Online (Sandbox Code Playgroud)

你得到的错误,

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

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


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


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

df_list <- list(df1 = df1, df2 = df2, df3 = df3)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用lapply操作的每个数据帧中的循环,或使用它们合并成一个单一的数据帧rbinddplyr::bind_rows.

  • +1对于最后一句.如果向那些显然不知道有更好/更安全/更简单的方式(例如,使用列表)的人展示如何做到这一点,那我就是矛盾的.它可能只是支持坏习惯. (2认同)