Re: [Rd] rm() deletes 'c' if c('a','b') is the argument (PR#9399)

From: Duncan Murdoch <murdoch_at_stats.uwo.ca>
Date: Wed 29 Nov 2006 - 20:49:00 GMT

On 11/29/2006 3:31 PM, p.dalgaard@biostat.ku.dk wrote:

> Steven McKinney wrote:

>> Same behaviour seen on Apple Mac OSX 10.4.8 platform:
>>
>>
>>> sessionInfo()
>>>
>> R version 2.4.0 Patched (2006-10-31 r39758)
>> powerpc-apple-darwin8.8.0
>>
>> locale:
>> en_CA.UTF-8/en_CA.UTF-8/en_CA.UTF-8/C/en_CA.UTF-8/en_CA.UTF-8
>>
>> attached base packages:
>> [1] "methods" "stats" "graphics" "grDevices" "utils" "datasets" "base"
>>
>> other attached packages:
>> XML
>> "1.2-0"
>>
>>> ls()
>>>
>> [1] "getMonograph" "last.warning" "myfun"
>>
>>> a <- 1
>>> b <- 2
>>> c <- letters
>>> a
>>>
>> [1] 1
>>
>>> b
>>>
>> [1] 2
>>
>>> c
>>>
>> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
>>
>>> rm(c('a', 'b'))
>>> a
>>>
>> Error: object "a" not found
>>
>>> b
>>>
>> Error: object "b" not found
>>
>>> c
>>>
>> .Primitive("c")
>>
>>> ls()
>>>
>> [1] "getMonograph" "last.warning" "myfun"
>>
>>> a <- 1
>>> b <- 2
>>> d <- letters
>>> ls()
>>>
>> [1] "a" "b" "d" "getMonograph" "last.warning" "myfun"
>>
>>> rm(c('a', 'b'))
>>>
>> Warning message:
>> remove: variable "c" was not found
>>
>>> ls()
>>>
>> [1] "d" "getMonograph" "last.warning" "myfun"
>>
>>
>> Steven McKinney
>>
>> Statistician
>> Molecular Oncology and Breast Cancer Program
>> British Columbia Cancer Research Centre
>>
>> email: smckinney@bccrc.ca
>>
>> tel: 604-675-8000 x7561
>>
>> BCCRC
>> Molecular Oncology
>> 675 West 10th Ave, Floor 4
>> Vancouver B.C.
>> V5Z 1L3
>> Canada
>>
>>
>>
>>
>> -----Original Message-----
>> From: r-devel-bounces@r-project.org on behalf of hanl2@wyeth.com
>> Sent: Wed 11/29/2006 10:35 AM
>> To: r-devel@stat.math.ethz.ch
>> Cc: R-bugs@biostat.ku.dk
>> Subject: [Rd] rm() deletes 'c' if c('a','b') is the argument (PR#9399)
>>
>> Full_Name: Lixin Han
>> Version: 2.4.0
>> OS: Windows 2000
>> Submission from: (NULL) (155.94.110.222)
>>
>>
>> A character vector c('a','b') is supplied to rm(). As a result, 'c' is deleted
>> unintentionally.
>>
>>
>>> a <- 1:5
>>> b <- 'abc'
>>> c <- letters
>>> ls()
>>>
>> [1] "a" "b" "c"
>>
>>> rm(c('a','b'))
>>> ls()
>>>
>> character(0)
>>
>>
>>
> The reason is that
>  > x <- function(...) sapply(match.call(expand.dots = FALSE)$..., 
> as.character)
>  > x(c(a,b))
>      [,1]
> [1,] "c"
> [2,] "a"
> [3,] "b"
> 
> Which in turn happens because
>  > as.character(quote(c(a,b)))
> [1] "c" "a" "b"
> 
> I don't know if it really qualifies as a bug, but it's not documented 
> that as.character() is used and I suppose we could be more careful with 
> the argument checking.

I'd say it qualifies as a bug if we remove something that the user didn't ask to have removed. A user would have a right to be annoyed if

rm( NotNeeded("a", "b") )

(where NotNeeded was a function to give the subset of variables which are not needed) went ahead and removed all the variables, *plus* the NotNeeded function!

Duncan Murdoch



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu Nov 30 19:51:33 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Thu 30 Nov 2006 - 12:30:56 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.