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

From: Steven McKinney <smckinney_at_bccrc.ca>
Date: Wed 29 Nov 2006 - 20:01:14 GMT

The argument should indeed be made.

I think the documentation for rm() needs to be changed to:

Arguments:

      ...: the object to be removed, supplied individually.  Multiple objects
           must be supplied via the list argument. 



>From the rm() help page:

rm (..., list = character(0), pos = -1,

       envir = as.environment(pos), inherits = FALSE) Arguments

... the objects to be removed, supplied individually and/or as a character vector

> class(c('a', 'b'))

[1] "character"
>
> length(c('a', 'b'))

[1] 2
> is.vector(c('a', 'b'))
[1] TRUE
>

By all appearances, c('a', 'b') seems
to be a character vector. I'm not the
most knowledgeable R programmer, so I'm not sure what I'm missing here.

I haven't delved deeply into the rm() source code, but this looks like a logical bug. The documentation needs to be modified to fit the current function behaviour, or the current function behaviour needs to be modified to fit the documentation.

> rm(c('a', 'b'))
Warning message:
remove: variable "c" was not found

Why is "c" ending up in the list of items to remove? (see PS: below)

> unlist(list('a', 'b'))

[1] "a" "b"
> class(unlist(list('a', 'b')))

[1] "character"
> is.vector(unlist(list('a', 'b')))

[1] TRUE
> a <- 1
> b <- 2
> rm(unlist(list('a', 'b')))

Warning messages:
1: remove: variable "unlist" was not found 2: remove: variable "list("a", "b")" was not found
> ls()

[1] "a" "b" "d" "getMonograph" "last.warning" "myfun"
>

Does the rm() doc need modification?

Presently it appears that the doc should read

Arguments:

      ...: the object to be removed, supplied individually.  Multiple objects
           must be supplied via the list argument. 




PS:

Does it have anything to do with this
type of behaviour? Is this essentially
what is happening in the match.call()
in rm()?

> sapply(substitute(c('a', 'b')), as.character)
[1] "c" "a" "b"

> rm

function (..., list = character(0), pos = -1, envir = as.environment(pos),

    inherits = FALSE)
{

    names <- sapply(match.call(expand.dots = FALSE)$..., as.character)     if (length(names) == 0)

        names <- character(0)
    list <- .Primitive("c")(list, names)     .Internal(remove(list, envir, inherits)) }
<environment: namespace:base>
> sapply(c('a', 'b'), as.character)

  a b
"a" "b"
> sapply(substitute(c('a', 'b')), as.character)
[1] "c" "a" "b"
> match.call

function (definition = NULL, call = sys.call(sys.parent()), expand.dots = TRUE) .Internal(match.call(definition, call, expand.dots)) <environment: namespace:base>

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: James W. MacDonald [mailto:jmacdon@med.umich.edu] Sent: Wed 11/29/2006 11:14 AM
To: Steven McKinney
Cc: hanl2@wyeth.com; r-devel@stat.math.ethz.ch; R-bugs@biostat.ku.dk Subject: Re: [Rd] rm() deletes 'c' if c('a','b') is the argument (PR#9399)  

That's because you are not using rm() correctly. From the help page:

Arguments:

      ...: the objects to be removed, supplied individually and/or as a
           character vector

     list: a character vector naming objects to be removed.

So if you pass an unnamed argument, rm() will assume you have some objects in the .GlobalEnv with those names that you would like to remove. If you want to pass a character vector, you have to name it because the first argument is '...'.

 > a <- 1:5
 > b <- 2:10
 > c <- "not a good variable name"
 > rm(list=c("a","b"))
 > c

[1] "not a good variable name"
 > a <- 1:5
 > b <- 2:10
 > c <- "still not a good variable name"
 > rm(a,b)
 > c

[1] "still not a good variable name"
 > a <- 1:5
 > b <- 2:10
 > c <- "still not a good variable name"
 > rm("a","b")
 > c

[1] "still not a good variable name"

NB: 'c' is not a good variable name because you are masking an existing function.

An argument could be made that the explanation for the first argument is not very exact.

Best,

Jim

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)
>
>
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
James W. MacDonald, M.S.
Biostatistician
Affymetrix and cDNA Microarray Core
University of Michigan Cancer Center
1500 E. Medical Center Drive
7410 CCGC
Ann Arbor MI 48109
734-647-5623


**********************************************************
Electronic Mail is not secure, may not be read every day, and should not be used for urgent or sensitive issues.

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Thu Nov 30 07:04:04 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 Wed 29 Nov 2006 - 20:30:59 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.