[Rd] Extra copies of objects in environments when using $ operator?

Winston Chang winstonchang1 at gmail.com
Fri Aug 5 19:27:57 CEST 2016


>
>
>> However, modifying a list contained in an environment *does* result in
>> a copy -- tracemem prints out some info when we do the assignment:
>>  e <- new.env(parent = emptyenv())
>>  e$x <- list(1)
>>  tracemem(e$x)
>>  # [1] "<0x1148c1708>"
>>  e$x[[1]] <- 2
>>  # tracemem[0x1148c1708 -> 0x11b2fc1b8]:
>>
>
> Currently e$x marks values as immutable if they have any references by
> setting NAMED to 2. You can see this with
>
> e <- new.env(parent = emptyenv())
>> e$x <- list(1)
>> .Internal(inspect(e))
>>
> @30b2498 04 ENVSXP g0c0 [NAM(1)] <0x30b2498>
> ENCLOS:
>   @2600e98 04 ENVSXP g0c0 [MARK,NAM(2)] <R_EmptyEnv>
> HASHTAB:
>   @2e41540 19 VECSXP g0c7 [] (len=29, tl=1)
>     @25c9628 00 NILSXP g0c0 [MARK,NAM(2)]
>     @25c9628 00 NILSXP g0c0 [MARK,NAM(2)]
>     @25c9628 00 NILSXP g0c0 [MARK,NAM(2)]
>     @25c9628 00 NILSXP g0c0 [MARK,NAM(2)]
>     @30b3370 02 LISTSXP g0c0 []
>       TAG: @2637870 01 SYMSXP g0c0 [MARK,NAM(2)] "x"
>       @3569488 19 VECSXP g0c1 [NAM(1)] (len=1, tl=0)   ## <--- NAM = 1
>       @35694e8 14 REALSXP g0c1 [NAM(2)] (len=1, tl=0) 1
>     ...
>
>> e$x
>>
> [[1]]
> [1] 1
>
> .Internal(inspect(e))
>>
> @30b2498 04 ENVSXP g0c0 [NAM(1)] <0x30b2498>
> ENCLOS:
>   @2600e98 04 ENVSXP g0c0 [MARK,NAM(2)] <R_EmptyEnv>
> HASHTAB:
>   @2e41540 19 VECSXP g0c7 [] (len=29, tl=1)
>     @25c9628 00 NILSXP g0c0 [MARK,NAM(2)]
>     @25c9628 00 NILSXP g0c0 [MARK,NAM(2)]
>     @25c9628 00 NILSXP g0c0 [MARK,NAM(2)]
>     @25c9628 00 NILSXP g0c0 [MARK,NAM(2)]
>     @30b3370 02 LISTSXP g0c0 []
>       TAG: @2637870 01 SYMSXP g0c0 [MARK,NAM(2)] "x"
>       @3569488 19 VECSXP g0c1 [NAM(2)] (len=1, tl=0)   ## <--- NAM = 2
>       @35694e8 14 REALSXP g0c1 [NAM(2)] (len=1, tl=0) 1
>     ...
>
> It is not clear if this is needed or just done in an abundance of
> caution. If R is built to use reference counting for determining
> sharing information this does not happen, so this is likely to change
> and not force a copy by 3.4.0.
>

Excellent, that's great to hear!

-Winston

	[[alternative HTML version deleted]]



More information about the R-devel mailing list