如何重命名R中的变量而不复制对象?

时间:2014-04-09 02:40:13

标签: r

我在R的全局环境中加载了一个名为df的巨大数据框。如何在不复制数据框的情况下重命名数据框,方法是将其分配给另一个符号并删除原始数据框?

3 个答案:

答案 0 :(得分:39)

如果变量相同,R足够聪明,不能制作副本,所以请继续,重新分配原始版本rm()

示例:

x <- 1:10
tracemem(x)
# [1] "<0000000017181EA8>"
y <- x
tracemem(y)
# [1] "<0000000017181EA8>"

正如我们所看到的,两个对象都指向同一个地址。如果其中一个被修改,则R在内存中创建一个新副本,即:2个对象不再相同。

# Now change one of the vectors
y[2] <- 3
# tracemem[0x0000000017181ea8 -> 0x0000000017178c68]: 
# tracemem[0x0000000017178c68 -> 0x0000000012ebe3b0]: 
tracemem(x)
# [1] "<0000000017181EA8>"
tracemem(y)
# [1] "<0000000012EBE3B0>"

相关文章:How do I rename an R object?

答案 1 :(得分:1)

mv包中有一个名为gdata的函数。

library(gdata)

x <- data.frame(A = 1:100, B = 101:200, C = 201:300)

tracemem(x)
"<0000000024EA66F8>"

mv(from = "x", to = "y")

tracemem(y)
"<0000000024EA66F8>"

您会注意到,tracememx的{​​{1}}输出是相同的。查看y的代码,您将看到它将对象分配给作用域中的环境,然后删除了旧对象。这与使用C8H10N4O2的方法非常相似(尽管mv用于单个对象),但是至少该函数易于使用。

答案 2 :(得分:0)

要将接受的答案应用于许多对象,您可以使用assign(new_name, get(old_name))后跟rm(list= old_names)的循环。例如,如果您要将old_dfold_xold_y,...替换为new_dfnew_x ...

for (obj_old_name in ls(pattern='old_')){
  assign(sub('old_','new_',obj_old_name), get(obj_old_name))
}
rm(list=ls(pattern='old_'))