我有多个data.table
,每个都分配给自己的变量dt1
,dt2
等。我想对dt1
,dt2
应用一个函数,...和保留原始变量名。我想避免使用dt1 <- foo(dt1)
,dt2 <- foo(dt2)
之类的硬编码语法。我的解决方案如下。
dataSets <- list(dt1 = dt1, dt2 = dt2, dt3 = dt3, dt4 = dt4, dt5 = dt5)
for (i in 1:length(dataSets)) {
dataSet <- dataSets[[i]]
name <- names(dataSets)[i]
assign(name, foo(dataSet))
}
我认为我的解决方案不是很优雅。我不喜欢使用name
和assign
。
在可能的情况下,如何才能重新完成自己的工作,以避免需要name
和assign
?
我想象解决方案可能涉及使用对dt1
,dt2
,....的引用,而不是副本。我想到创建一个referenceList
。它不会复制dt1
,dt2
,...。而是指向这些变量。我想象过要创建一个referenceList
,例如rl <- referenceList(dt1)
。然后,将foo
应用于rl
,foo(rl[1])
将更改dt1
。
答案 0 :(得分:2)
R通常无法创建对变量的引用。 (某些对象,例如环境,总是通过引用来处理,但大多数不是。)
执行类似操作的通常方法是将对象放在列表中,然后仅在列表上工作,而无需费心再次提取它们。例如,
dataSets <- list(dt1 = dt1, dt2 = dt2, dt3 = dt3, dt4 = dt4, dt5 = dt5)
for (i in seq_along(dataSets) {
dataSets[[i]] <- foo(dataSets[[i]])
}
如果您真的希望将结果返回到原始对象中,那么我就不会麻烦将所有这些对象都放到一个列表中,我会使用名称向量。例如:
names <- paste0("dt", 1:5)
for (i in seq_along(names)) {
assign(names[i], foo(get(names[i])))
}
但是,这比仅处理列表中的数据要优雅得多。