質問

関数に引数を渡すとき、変数のコピーを作成するときなどに R が使用するロジックを理解したいと考えています。メモリ使用量に関して。実際に変数のコピーが作成されるのはいつですか。その変数への参照を渡すだけですか?特に私が興味がある状況は次のとおりです。

f <- function(x) {x+1}
a <- 1
f(a)

a 文字通り渡されることなのか、それとも渡されることへの言及なのか?

x <- 1
y <- x

コピーの参考?そうでないのはいつですか?

誰かがこれを私に説明できれば、非常に感謝します。

役に立ちましたか?

解決

変数を渡すと、参照ではなく常にコピーによって行われます。ただし、課題が実際に発生するまで作られたコピーを取得しません。プロセスの実際の説明は、約束を伴う。ドキュメントを見てください

?force
?delayedAssign
.

1つの実用的な意味は、名目上占有されているあなたの物体の少なくとも2倍のRAMを必要とするのを避けることは不可能ではないことが非常に困難であるということです。大きなオブジェクトを変更すると、一般的に一時的なコピーを作成する必要があります。

アップデート:2015:私は(そしてded)Matt Dowleと一致していますか.tableパッケージは、コピー複製の問題を回避する代入への代替ルートを提供します。それが更新が要求された場合は、提案が行われた時点でそれを理解していませんでした。

applyReduceの評価規則には、R 3.2.1の最近の変更がありました。ここでのニュースを参照してとても発表されました。 「>素拠から匿名関数を返す - 何が間違っているのですか?

コメントのJhetzelが挙げた面白い紙はここにあります

他のヒント

遅い答えですが、言語設計の非常に重要な側面ですが、Web (または少なくとも通常のソース) では十分に報道されていません。

x <- c(0,4,2)
lobstr::obj_addr(x)
# [1] "0x7ff25e82b0f8"
y <- x
lobstr::obj_addr(y)
# [1] "0x7ff25e82b0f8"

同一の「メモリアドレス」に注目してください。オブジェクトが保存されているメモリ内の場所。したがって、次のことが確認できます x そして y 両方とも同じ識別子を指します。

Hadley Wickham の Advanced R の本では、次のように触れられています。

このコードを考えてみましょう:

x <- c(1, 2, 3)

次のように読むと簡単です。「値1、2、および3を含む「x」という名前のオブジェクトを作成します。」残念ながら、それは、Rが実際に舞台裏で何をしているかについての不正確な予測につながる単純化です。このコードが2つのことを行っていると言う方が正確です。

オブジェクト、つまり値のベクトルを作成しています。 c(1, 2, 3). 。そして、それはその対象を名前に拘束しています、 x. 。言い換えれば、オブジェクトまたは値には名前がありません。実際に値があるのは名前です。

これらのメモリ アドレスは一時的であり、新しい R セッションごとに変化することに注意してください。

ここからが重要な部分です。

R セマンティクスでは、オブジェクトは値によってコピーされます。これは、コピーを変更すると、元のオブジェクトがそのまま残ることを意味します。メモリ内のデータをコピーすることは高価な操作であるため、Rのコピーは可能な限り怠zyです。これらは、新しいオブジェクトが実際に変更された場合にのみ発生します。ソース:[R 言語ドキュメント][1]

したがって、次の値を変更すると、 y ベクトルに値を追加することで、 y 今度は別の「オブジェクト」を指します。これは、「新しいオブジェクトが変更された場合にのみ」コピー操作が発生する (遅延) というドキュメントの内容と一致します。 y は、以前とは異なるアドレスを指しています。

y <- c(y, -3)
print(lobstr::obj_addr(y))
# [1] "0x7ff25e825b48"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top