我有多个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
。
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])))
}
但这比仅使用列表中的数据要优雅得多。