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

时间:2018-09-09 00:20:01

标签: r reference

上下文

我有多个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

1 个答案:

答案 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])))
}

但是,这比仅处理列表中的数据要优雅得多。