Berwin A Turlach wrote: > >> foo = function(arg) arg$foo = foo >> >> e = new.env() >> foo(e) >> e$foo >> >> are you sure this is pass by value? >> > > But that is what environments are for, aren't they?
might be. > And it is > documented behaviour. sure! > Read section 2.1.10 ("Environments") in the R > Language Definition, haven't objected to that. i object to your 'r uses pass by value', which is only partially correct. > in particular the last paragraph: > > Unlike most other R objects, environments are not copied when > passed to functions or used in assignments. Thus, if you assign the > same environment to several symbols and change one, the others will > change too. In particular, assigning attributes to an environment can > lead to surprises. > > [..] > >> and actually, in the example we discuss, 'names<-' does *not* return >> an updated *tmp*, so there's even less to entertain. >> > > How do you know? Are you sure? Have you by now studied what goes on > under the hood? > yes, a bit. but in this example, it's enough to look into *tmp* to see that it hasn't got the names added, and since x does have names, names<- must have returned a copy of *tmp* rather than *tmp* changed: x = 1 tmp = x x = 'names<-'(tmp, 'foo') names(tmp) # NULL you suggested that "One reads the manual, (...) one reflects and investigates, ..." -- had you done it, you wouldn't have asked the question. > >> for fun and more guesswork, the example could have been: >> >> x = x >> x = 'names<-'(x, value=c('a', 'b')) >> > > But it is manifestly not written that way in the manual; and for good > reasons since 'names<-' might have side effects which invokes in the > last line undefined behaviour. Just as in the equivalent C snippet > that I mentioned. > i just can't get it why the manual does not manifestly explain what 'names<-' does, and leaves you doing the guesswork you suggest. vQ ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel