我们可以一次在多个对象上 setDT 吗?

Gre*_*001 3 r data.table

我需要从外部加载许多 rds 文件,为了让事情变得更顺畅,我倾向于在对象上设置 DT。

是否可以一次设置所有的DT?我试过:

lapply(ls(), setDT)
lapply(list(ls()), setDT)
for(i in ls()) setDT(i)

#Error in FUN(X[[i]], ...) : 
#  Argument 'x' to 'setDT' should be a 'list', 'data.frame' or 'data.table'
Run Code Online (Sandbox Code Playgroud)

结果都是一样的。有没有更优雅的方法来做到这一点?

ps 一位朋友建议使用do.call

do.call(setDT, list("A", "B", "C"))
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用。

Mic*_*ico 5

你可以Filter data.frame在一个环境中并应用于setDT那些:

all_data_tables = Filter(function(x) is.data.frame(eval(as.name(x))), ls())
lapply(all_data_tables, function(x) setDT(eval(as.name(x))))
Run Code Online (Sandbox Code Playgroud)

您也可以替换is.data.frameis.list或更复杂的东西,但我认为is.data.frame涵盖了您的用例。

您也可以使用get,也可以更小心指定envirls/ eval/ get