rm(list=ls()) doesn't completely clear the workspace

前端 未结 7 1338
一向
一向 2020-12-08 04:36

This is a very minor issue, but I would like to understand exactly what is going on here.

Say I do the following:

library(RMySQL)
con <- dbConnect         


        
相关标签:
7条回答
  • 2020-12-08 05:00

    attach() does not make copies of x and y in your global environment, it attaches a dataframe to the search path.

    From ?attach:

    The database is not actually attached.  Rather, a new environment
     is created on the search path and the elements of a list
     (including columns of a data frame) or objects in a save file or
     an environment are _copied_ into the new environment.  If you use
     ‘<<-’ or ‘assign’ to assign to an attached database, you only
     alter the attached copy, not the original object.  (Normal
     assignment will place a modified version in the user's workspace:
     see the examples.)  For this reason ‘attach’ can lead to
     confusion.
    

    For example:

    > search()
    [1] ".GlobalEnv"        "package:stats"     "package:graphics" 
    [4] "package:grDevices" "package:utils"     "package:datasets" 
    [7] "package:methods"   "Autoloads"         "package:base"     
    > a <- data.frame(stuff=rnorm(100))
    > search()
    [1] ".GlobalEnv"        "package:stats"     "package:graphics" 
    [4] "package:grDevices" "package:utils"     "package:datasets" 
    [7] "package:methods"   "Autoloads"         "package:base"     
    > attach(a)
    > search()
     [1] ".GlobalEnv"        "a"                 "package:stats"    
     [4] "package:graphics"  "package:grDevices" "package:utils"    
     [7] "package:datasets"  "package:methods"   "Autoloads"        
    [10] "package:base"     
    > rm(list=ls())
    > search()
     [1] ".GlobalEnv"        "a"                 "package:stats"    
     [4] "package:graphics"  "package:grDevices" "package:utils"    
     [7] "package:datasets"  "package:methods"   "Autoloads"        
    [10] "package:base"     
    > stuff
      [1] -0.91436377  0.67397624  0.62891651 -0.99669584  2.07692590 -0.62702302
      [...]
    > detach(a)
    > search()
    [1] ".GlobalEnv"        "package:stats"     "package:graphics" 
    [4] "package:grDevices" "package:utils"     "package:datasets" 
    [7] "package:methods"   "Autoloads"         "package:base"    
    
    0 讨论(0)
  • 2020-12-08 05:00

    To use detach() function to remove a specific package from Work Space, it requires the full description for the package.

    Example: Remove a package ISwR Answer 1: detach(ISwR) .... Not Work! The Package is still on the Work Space. Answer 2: detach(package:ISwR) .... WORKS! The Package is removed from the Work Space.

    0 讨论(0)
  • 2020-12-08 05:09

    You can use:

    rm(list=ls())
    

    or:

    rm(list=(ls()))
    

    but save your workspace before you close R.

    0 讨论(0)
  • 2020-12-08 05:13

    Just to mention... if you, perhaps, have hidden objects in your environment, like .First and .Last functions, you can remove them with rm(list = ls(all.names = TRUE)). But in your case, use detach(objectname) to remove object from search path. detach() will remove any object in position #2, since .GlobalEnv cannot be removed (and base too). With detach() you can unload previously loaded packages, so be careful (though you can always load them with library(packagename)).

    0 讨论(0)
  • 2020-12-08 05:15

    R itself says, in the help for rm:

    ## remove (almost) everything in the working environment.
    ## You will get no warning, so don't do this unless you are really sure.
    rm(list = ls())
    

    Note the 'almost'. There are different environments.

    Did you try detach(values1)?

    0 讨论(0)
  • 2020-12-08 05:16

    Most likely you have at least one other data frame or list attached with x and y columns/components. You can use the "conflicts" function to see all objects that have potential conflicts and use the "find" function to find out where those objects are (the "search" function also helps by showing all the things you have attached).

    Your question is a good example of why attaching data frames is being frowned upon, it is better to use functions like "with" or "within" so that you don't have problems from forgetting to detach objects.

    0 讨论(0)
提交回复
热议问题