[R] What the difference between .Golbalenv and package:base?
John McKown
john.archie.mckown at gmail.com
Mon Aug 25 19:26:28 CEST 2014
On Mon, Aug 25, 2014 at 11:19 AM, PO SU <rhelpmaillist at 163.com> wrote:
> As you know, in the search path, there is .GlobalEnv, package:stats and so
> on, why do we need to convert the character "package:stats" to the stats
> environment.
> I mean, why don't let package:stats be a environment type object like
> .GlobalEnv,but let it be a string ?
> Hope you understand my meaning for my pool english expression way.
>
Yes, you have Sorry for my misunderstanding of what were originally
saying. I _think_ that I now understand. The fault is likely my
concentrating on the wrong part of your original email. To test my
ability to understand, I submit the following possibility:
> new_name<-new.env();
> attach(new_name)
> search()
[1] ".GlobalEnv" "new_name" "new_name"
"tools:rstudio"
[5] "package:graphics" "package:grDevices" "package:utils"
"package:datasets"
[9] "package:methods" "Autoloads" "package:base"
> assign("a",2,pos="new_name")
> a
[1] 2
> ls()
[1] "new_name"
> ls(pos="new_name")
[1] "a"
>
Note the use of pos= instead of envir=. That seems to be the key here.
I hope this was of more use to you. One problem that I have noticed is
that you can not get to the value of "a" by using "new_name$a", but
must use the get() function like: get('a',pos='new_name');
Please be very aware of the following, very confusing fact:
Referencing a variable can not have the expected results.
> new_name <- new.env()
> attach(new_name)
> search()
[1] ".GlobalEnv" "new_name" "tools:rstudio"
"package:stats"
[5] "package:graphics" "package:grDevices" "package:utils"
"package:datasets"
[9] "package:methods" "Autoloads" "package:base"
> assign("a",2,"new_name")
> ls()
[1] "new_name"
> new_name$a
NULL
> get("a",pos="new_name")
[1] 2
> new_name$a <- 'x'
> new_name$a;
[1] "x"
> get("a",pos="new_name")
[1] 2
>
If you wanted to use string values in the first two commands above,
then perhaps:
> attach(NULL,name="new_name")
> search()
[1] ".GlobalEnv" "new_name" "tools:rstudio"
"package:graphics"
[5] "package:grDevices" "package:utils" "package:datasets"
"package:methods"
[9] "Autoloads" "package:base"
> assign("a",2,pos="new_name")
> ls()
character(0)
> ls(pos="new_name")
[1] "a"
> a
[1] 2
># or even
> ls("new_name")
[1] "a"
>
Likewise you can do:
> search()
[1] ".GlobalEnv" "tools:rstudio" "package:stats"
"package:graphics"
[5] "package:grDevices" "package:utils" "package:datasets"
"package:methods"
[9] "Autoloads" "package:base"
> ls(pos="package:stats")
[1] "acf" "acf2AR" "add.scope"
[4] "add1" "addmargins" "aggregate"
[7] "aggregate.data.frame" "aggregate.ts" "AIC"
[10] "alias" "anova" "ansari.test"
...
[436] "variable.names" "varimax" "vcov"
[439] "weighted.mean" "weighted.residuals" "weights"
[442] "wilcox.test" "window" "window<-"
[445] "write.ftable" "xtabs"
>
> get("time",pos="package:stats")
function (x, ...)
UseMethod("time")
<bytecode: 0x000000000a4e8b00>
<environment: namespace:stats>
> x<-get("time",pos="package:stats")
> x
function (x, ...)
UseMethod("time")
<bytecode: 0x000000000a4e8b00>
<environment: namespace:stats>
> # note that the get() basically created a variable in the global environment whose value was
> # the same as in the package. But you can change the value of "x" in the global environment
> # and it won't affect the value in the package. And vice versa, if you could update "x" in
> # the package, but that can't be done because packages seem to be locked and read-only.
>
>
>
> --
> PO SU
> mail: desolator88 at 163.com
> Majored in Statistics from SJTU
--
There is nothing more pleasant than traveling and meeting new people!
Genghis Khan
Maranatha! <><
John McKown
More information about the R-help
mailing list