3
は属性が機能に設定されている場合、オブジェクトRはオブジェクトをコピーするときに常にデータのコピーを作成しますか?
> dim(a) <- c(3, 2, 2)
> a
, , 1
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
, , 2
[,1] [,2]
[1,] 7 10
[2,] 8 11
[3,] 9 12
> dim(a) <- c(dim(a)[1L], prod(dim(a)[-1L]))
> a
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
が、何のコピーを作成していないdim
属性を設定する整数
> a <- 1:12
> tracemem(a)
の配列を考えてみましょうか?
> f <- function(x) { dim(x) <- c(dim(x)[1L], prod(dim(x)[-1L])); x}
> dim(a) <- c(3, 2, 2)
> f(a)
tracemem[0xb99678 -> 0x1b7aac30]: f
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
これでコピーが作成されました。私はa
とf(a)
が異なったオブジェクトであることを理解しますが、 これらのオブジェクトは同じデータを指しているか、またはデータも コピーされていますか?
私はほぼ完全にデータがコピーされると確信しています。それがコピーされていないことを示す兆候はありますか? – Roland
@Roland私は何の指示もしていませんが、データそのものは原則的に変更されていないので、両方のオブジェクト間で共有されている可能性があります。 –
@Rolandこの設定では、 'b < - f(a)'を実行すると、トレースメントのpingが得られます。 'b [1,1] < - 42'を実行すると、別の* tracemem pingが得られます。だから、何が起こっているのか不明です。私はここで 'f'を呼び出すときに根底にあるベクタ全体をコピーしなければならない理由を見ません。なぜなら、そうしているのかそうでないのかです。 –