[Rd] Odd behaviour in within.list() when deleting 2+ variables

Peter Dalgaard pdalgd at gmail.com
Mon Jun 26 20:12:38 CEST 2017


> On 26 Jun 2017, at 19:04 , Martin Maechler <maechler at stat.math.ethz.ch> wrote:
> 
>>>>>> peter dalgaard <pdalgd at gmail.com>
>>>>>>    on Mon, 26 Jun 2017 13:43:28 +0200 writes:
> 
>> This seems to be due to changes made by Martin Maechler in
>> 2008. Presumably this fixed something, but it escapes my
>> memory.
> 
> Yes: The change set (svn -c46441) also contains the following NEWS entry
> 
> BUG FIXES
> 
>     o	within(<dataframe>, { ... }) now also works when '...' removes
>     	more than one column.
> 

The odd thing is that the assign-NULL technique used for removing a single column, NOW also seems to work for several columns in a data frame, so I wonder what the bug was back then...

-pd


> 
>> However, it seems to have broken the equivalence
>> between within.list and within.data.frame, so now
> 
>>  within.list <- within.data.frame
> 
>> does not suffice.
> 
> There have been many improvements since then, so maybe we can
> change the code so that the above will work again.
> 
> Another problem seems that we had no tests of  within.list()
> anywhere... so we will have them now.
> 
> I've hade an idea that seems to work and even simplify the
> code....  will get back to the issue later in the evening.
> 
> Martin
> 
> 
>> The crux of the matter seems to be that both the following
>> constructions work for data frames
> 
>>> aq <- head(airquality)
>>> names(aq)
>> [1] "Ozone"   "Solar.R" "Wind"    "Temp"    "Month"   "Day"    
>>> aq[c("Wind","Temp")] <- NULL
>>> aq
>> Ozone Solar.R Month Day
>> 1    41     190     5   1
>> 2    36     118     5   2
>> 3    12     149     5   3
>> 4    18     313     5   4
>> 5    NA      NA     5   5
>> 6    28      NA     5   6
>>> aq <- head(airquality)
>>> aq[c("Wind","Temp")] <- vector("list",2)
>>> aq
>> Ozone Solar.R Month Day
>> 1    41     190     5   1
>> 2    36     118     5   2
>> 3    12     149     5   3
>> 4    18     313     5   4
>> 5    NA      NA     5   5
>> 6    28      NA     5   6
> 
>> However, for lists they differ:
> 
>>> aq <- as.list(head(airquality))
>>> aq[c("Wind","Temp")] <- vector("list",2)
>>> aq
>> $Ozone
>> [1] 41 36 12 18 NA 28
> 
>> $Solar.R
>> [1] 190 118 149 313  NA  NA
> 
>> $Wind
>> NULL
> 
>> $Temp
>> NULL
> 
>> $Month
>> [1] 5 5 5 5 5 5
> 
>> $Day
>> [1] 1 2 3 4 5 6
> 
>>> aq <- as.list(head(airquality))
>>> aq[c("Wind","Temp")] <- NULL
>>> aq
>> $Ozone
>> [1] 41 36 12 18 NA 28
> 
>> $Solar.R
>> [1] 190 118 149 313  NA  NA
> 
>> $Month
>> [1] 5 5 5 5 5 5
> 
>> $Day
>> [1] 1 2 3 4 5 6
> 
> 
>> -pd
> 
>>> On 26 Jun 2017, at 04:40 , Hong Ooi via R-devel <r-devel at r-project.org> wrote:
>>> 
>>> The behaviour of within() with list input changes if you delete 2 or more variables, compared to deleting one:
>>> 
>>> l <- list(x=1, y=2, z=3)
>>> 
>>> within(l,
>>> {
>>> rm(z)
>>> })
>>> #$x
>>> #[1] 1
>>> #
>>> #$y
>>> #[1] 2
>>> 
>>> 
>>> within(l, {
>>> rm(y)
>>> rm(z)
>>> })
>>> #$x
>>> #[1] 1
>>> #
>>> #$y
>>> #NULL
>>> #
>>> #$z
>>> #NULL
>>> 
>>> 
>>> When 2 or more variables are deleted, the list entries are instead set to NULL. Is this intended?
>>> 
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
>> -- 
>> Peter Dalgaard, Professor,
>> Center for Statistics, Copenhagen Business School
>> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
>> Phone: (+45)38153501
>> Office: A 4.23
>> Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com
> 
> 
> 
> 
> 
> 
> 
> 

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Office: A 4.23
Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com



More information about the R-devel mailing list