2017-09-21 5 views
1

Rのベクターのコピーを作成しようとしています... list_fooとしましょう。Rのベクトルの正確なコピーを作成する最も簡単な方法は?

list_barという別のリストを作成したいとします。同じ要素と長さのすべてが同じlist_fooの完全コピーです。 Rでこれをやっていく最も簡単な方法は何ですか?

ライブラリをインポートしないソリューションが推奨されます。

+10

'list_bar < - list_foo'? –

+0

何もコピーしない@DamianoFantini、それらは両方ともメモリ 'x = c(1、2、3);の同じオブジェクトを参照します。 y = x; pryr :: address(x)== pryr :: address(y) ' –

+0

@ScottWarchalオブジェクトのいずれかを変更しない限り、正しいです...私はこの点について私の答えで取り上げました。それでも、私はあなたがこれについて心配する理由はないと思います。なぜなら、Rはメモリ内のオブジェクトを更新する問題を処理するからです。 –

答えて

2

としては、ケンの答えで指摘し、私のコメントの中で、私はRのコミュニティの99%が<-を使用するためにあなたを示唆することだと思いますオペレーター。ただし、メモリ内の2つのオブジェクトの位置に関するコメントは正しいです。

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

ここで、そのうちの1つを変更するとどうなりますか?

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

Rは、変数名が実際にオブジェクトへのポインタであるPythonと似ていません。

Pythonでは、好きではない追加ライブラリ(copyなど)が必要です。 Rであなただけのこの操作を行うことができますし、新しいオブジェクトがlist_barが作成されたと呼ばれる:

list_bar <- list_foo 
+0

それらのうちの1つを変更しない限り、それらは同じオブジェクトです。 –

関連する問題