[Rd] Error when assigning value in environment which is a locked binding

Simon Urbanek simon.urbanek at r-project.org
Mon Aug 11 16:41:30 CEST 2014


On Aug 10, 2014, at 10:07 PM, Winston Chang <winstonchang1 at gmail.com> wrote:

> Another oddity - even though there's an error thrown in assignment to
> x$y$z, the assignment succeeds.
> 
> x <- new.env()
> x$y <- new.env()
> lockEnvironment(x, bindings = TRUE)
> x$y$z <- 1
> # Error in x$y$z <- 1 : cannot change value of locked binding for 'y'
> 
> x$y$z
> # [1] 1
> 
> 
> So I assume there must be a bug somewhere in here.
> 

Why?

In both cases (including your previous post) the you have two separate assignments: (x$y)$z <-1 followed by x$y <- y. So the first one always succeeds since there is no reason for it not to, but the second one doesn't because the binding is locked. 

I presume the confusion comes from the fact that environments are mutable, so x$y changes even if it was not assigned so it's irrelevant if the second assignment succeeds or not.

Cheers,
Simon


> -Winston
> 
> 
> 
> On Sun, Aug 10, 2014 at 8:46 PM, Winston Chang <winstonchang1 at gmail.com>
> wrote:
> 
>> If an environment x contains a locked binding y which is also an
>> environment, and then you try to assign a value to a binding inside of
>> y, it can either succeed or fail, depending on how you refer to
>> environment y.
>> 
>> x <- new.env()
>> x$y <- new.env()
>> lockEnvironment(x, bindings = TRUE)
>> 
>> # This assignment fails
>> x$y$z <- 1
>> # Error in x$y$z <- 1 : cannot change value of locked binding for 'y'
>> 
>> # Saving x$y to another variable, and then assigning there works
>> y2 <- x$y
>> y2$z <- 10  # OK
>> print(x$y$z)
>> # 10
>> 
>> 
>> Is this a bug or a feature? I realize that x$y is a locked binding
>> while y2 is not.
>> 
>> -Winston
>> 
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 



More information about the R-devel mailing list