我正在尝试在R中创建一个矢量副本...让我们称之为list_foo
。
我想创建另一个名为list_bar
的列表,它是list_foo
的精确副本,具有所有相同的元素和长度。在R中最简单的方法是什么?
首选没有导入库的解决方案。
答案 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