2016-03-23 5 views
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 

これでコピーが作成されました。私はaf(a)が異なったオブジェクトであることを理解しますが、 これらのオブジェクトは同じデータを指しているか、またはデータも コピーされていますか?

+0

私はほぼ完全にデータがコピーされると確信しています。それがコピーされていないことを示す兆候はありますか? – Roland

+0

@Roland私は何の指示もしていませんが、データそのものは原則的に変更されていないので、両方のオブジェクト間で共有されている可能性があります。 –

+0

@Rolandこの設定では、 'b < - f(a)'を実行すると、トレースメントのpingが得られます。 'b [1,1] < - 42'を実行すると、別の* tracemem pingが得られます。だから、何が起こっているのか不明です。私はここで 'f'を呼び出すときに根底にあるベクタ全体をコピーしなければならない理由を見ません。なぜなら、そうしているのかそうでないのかです。 –

答えて

0

pryrパッケージからのobject_sizeの出力は、データ がコピーされていることを示しています。

> object_size(list(a)) 
304 B 
> object_size(list(a, a)) 
312 B 
> object_size(list(a, a, a)) 
328 B 
> b <- f(a) 
tracemem[0x1fa7660 -> 0xbadae8]: f 
> object_size(list(a, b)) 
504 B 
> 
関連する問題