将函数应用于变量引用而不是R中的副本

问题描述 投票:1回答:1

上下文

我有多个data.table,每个都分配给他们自己的变量,dt1dt2等。我想将函数应用于dt1dt2,...,并保留原始变量名称。我想避免像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))
}

我不认为我的解决方案非常优雅。我不喜欢我如何使用nameassign

如果可能的话,我可以如何改变我所做的,以避免需要nameassign

我的想法

我想解决方案可能涉及使用dt1dt2,....而不是副本。我想创造一个referenceList。它不会复制dt1dt2,....相反,它会指向那些变量。我想象创造一个referenceList,像rl <- referenceList(dt1)。然后,将foo应用于rlfoo(rl[1])将改变dt1

r reference
1个回答
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])))
}

但这比仅使用列表中的数据要优雅得多。

© www.soinside.com 2019 - 2024. All rights reserved.