> > >> 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]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel