Rのベクターのコピーを作成しようとしています... list_foo
としましょう。Rのベクトルの正確なコピーを作成する最も簡単な方法は?
list_bar
という別のリストを作成したいとします。同じ要素と長さのすべてが同じlist_foo
の完全コピーです。 Rでこれをやっていく最も簡単な方法は何ですか?
ライブラリをインポートしないソリューションが推奨されます。
Rのベクターのコピーを作成しようとしています... list_foo
としましょう。Rのベクトルの正確なコピーを作成する最も簡単な方法は?
list_bar
という別のリストを作成したいとします。同じ要素と長さのすべてが同じlist_foo
の完全コピーです。 Rでこれをやっていく最も簡単な方法は何ですか?
ライブラリをインポートしないソリューションが推奨されます。
としては、ケンの答えで指摘し、私のコメントの中で、私は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
を利用したくない理由が表示されません。それはとても簡単です!
Rは、変数名が実際にオブジェクトへのポインタであるPythonと似ていません。
Pythonでは、好きではない追加ライブラリ(copy
など)が必要です。 R
であなただけのこの操作を行うことができますし、新しいオブジェクトがlist_bar
が作成されたと呼ばれる:
list_bar <- list_foo
それらのうちの1つを変更しない限り、それらは同じオブジェクトです。 –
'list_bar < - list_foo'? –
何もコピーしない@DamianoFantini、それらは両方ともメモリ 'x = c(1、2、3);の同じオブジェクトを参照します。 y = x; pryr :: address(x)== pryr :: address(y) ' –
@ScottWarchalオブジェクトのいずれかを変更しない限り、正しいです...私はこの点について私の答えで取り上げました。それでも、私はあなたがこれについて心配する理由はないと思います。なぜなら、Rはメモリ内のオブジェクトを更新する問題を処理するからです。 –