[Rd] residual '*tmp*' variable after "[<-" error

Prof Brian Ripley ripley at stats.ox.ac.uk
Fri Sep 22 07:45:30 CEST 2006


On Wed, 20 Sep 2006, Prof Brian Ripley wrote:

> On Wed, 20 Sep 2006, Parlamis Franklin wrote:
>
>> self-sanity check prior to filing a bug report:
>> 
>> attempted replacement that generates an error leaves a '*tmp*'
>> variable in the global environment.
>> 
>> test <- 1:10
>> test[2:4] <- expression(e)
>> ls()
>> 
>> i've read section 3.4.4 of the "R Language Definition" which
>> discusses the mechanism for replacement, and it is not clear to me
>> whether this was intended, but i suspect not (to be honest, it's not
>> clear to me why the process as described doesn't generate an infinite
>> recursion -- perhaps the primitive treats the argument named '*tmp*'
>> different than other arguments).  i've also searched the R site, and
>> can't find this particular issue discussed.
>> 
>> even though, as below, i am using 2.4.0 alpha, this happens as well
>> in 2.3.1.
>> 
>> from my standpoint, desirable behavior would be:
>> 
>> (i) if an error occurs, remove the '*tmp*' variable
>
> That's a bug: it need a context set to clean up.

Fixed in 2.4.0

>> (ii) report the error as occurring in the original replacement call
>> (rather than the '*tmp*' replacement, which may be confusing to those
>> who haven't read the "R Language Definition")
>
> But by that point the call may have been transformed quite dramatically.
> I was going to suggest traceback() would give you a sensible call, but in 
> this case it is not doing so: at a quick glance that is also due to no 
> context being set.

That was true for some of the subassignment error messages, but not this 
one: it depended on whether error() or errorcall() was used.  Since it 
potentially changes error messages in package checking, I have tidied this 
up for 2.5.0 only.

> There is also the question as to whether this should have worked.  It 
> probably could be made to do so as
>
> test <- as.expression(test)
> test[2:4] <- expression(e)

Yes, this was just some missing cases in subassign.c which I have added 
for 2.5.0.  Here is a related case in R-devel:

> test <- 1:10
> try(test[2:4] <- ls) # fails
Error in test[2:4] <- ls : incompatible types (from closure to integer) in 
subassignment type fix

Compare 2.4.0 beta:

> test <- 1:10
> try(test[2:4] <- ls) # fails
Error in `[<-`(`*tmp*`, 2:4, value = function (name, pos = -1, envir = 
as.environment(pos),  :
         incompatible types (from closure to integer) in subassignment type 
fix


-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




More information about the R-devel mailing list