在R中创建矢量精确副本的最简单方法是什么?

时间:2017-09-21 20:01:43

标签: arrays r list vector copy

我正在尝试在R中创建一个矢量副本...让我们称之为list_foo

我想创建另一个名为list_bar的列表,它是list_foo的精确副本,具有所有相同的元素和长度。在R中最简单的方法是什么?

首选没有导入库的解决方案。

2 个答案:

答案 0 :(得分:2)

正如Ken的回答和我的评论所指出的,我认为99%的R社区会建议您使用<-运营商。但是,关于2个对象在内存中的位置的注释是正确的。

library(pryr)
x <- c(1, 2, 3) 
y <- x
pryr::address(x) == pryr::address(y) #true
pryr::address(x)
# [1] "0x5832a668"

现在,如果修改其中一个会发生什么?

x <- "hello world"
x
# [1] "hello world" # updated x, new location in the memory
pryr::address(x)
# [1] "0xa72aab88"
y
# [1] 1 2 3 #still the same
pryr::address(y)
# [1] "0x5832a668"

R负责处理存储对象的位置,并自动为更新的对象创建新位置。所以你不必担心。你真的想要一份副本,即使R可以自己处理吗?如果是这样(如果您的对象是向量),您可以使用sapply(或lapply表示列表,或更复杂的方法用于其他类型的结构)。

# the 'y' object
y
# [1] 1 2 3
pryr::address(y)
# [1] "0x7d10bf68"

# let's create a copy of 'y' using sapply()
x <- sapply(y, function(i) i)  

# same vector, different location in the memory
pryr::address(x)
# [1] "0x5a8755b0"

# are they really identical? Yes
identical(x, y)  
# [1] TRUE

但是,我没有看到你真正想要利用x <- y的原因。这很容易!

答案 1 :(得分:1)

R与Python不同,其中变量名实际上是指向对象的指针。

在Python中,你需要你不喜欢的额外库(如copy)。在R中,您可以执行此操作,并创建一个名为list_bar的新对象:

list_bar <- list_foo