[R] package environment versus namespace environment

Benjamin Tyner btyner at gmail.com
Sun Mar 9 18:59:48 CET 2014


   Duncan,
   Thanks for the explanation and commentary. Starting to make more sense...so,
   long story short, it seems the first thing one should check is whether base
   imports utils:
      > packageDescription("base")
      Package: base
      Version: 3.0.1
      Priority: base
      Title: The R Base Package
      Author: R Core Team and contributors worldwide
      Maintainer: R Core Team [1]<R-core at r-project.org>
      Description: Base R functions
      License: Part of R 3.0.1
      Built: R 3.0.1; ; 2013-10-16 10:50:56 UTC; unix
      -- File: /usr/lib/R/library/base/Meta/package.rds
   I'll interpret the lack of an "Imports:" line to mean that base does not
   import  any packages. So then the next thing to check is the enclosing
   environment:
      > parent.env(.BaseNamespaceEnv)
      <environment: R_GlobalEnv>
   Ah-ha! Unlike the base package environment, the base namespace environment
   has its enclosing environment already on the search path, so eventually
   leads back to utils. (This is the piece of the puzzle prompting my original
   question about "... machinery that allows ...")
   So hypothetically, if I had attached utils ahead of .GlobalEnv on the search
   path, then functions in the base namespace would no longer be able to see
   objects in utils? (I realize the answer may be vacuous, since library() does
   not honor pos=1).
   Regards,
   Ben
   On 03/09/2014 09:09 AM, Duncan Murdoch wrote:

     On 14-03-08 6:42 PM, Benjamin Tyner wrote:

     Duncan,
     Thank you for the informative link. So, do the loaded namespaces have an
     "ordering" akin to the package search path that determines that
     functions in the base namespace can see objects in the utils namespace?
     (I noticed that loadedNamespaces() just comes back in alphabetical order.)

     No.  The article that Henrik cited gives a reasonable description up until
     near  the  end, where (in my opinion) it makes things unnecessarily
     complicated.  I'd recommend that you stop reading around where he tries to
     explain the dotted lines.  In particular, ignore the second version of the
     "Map  of  the World"; the first one is accurate, the second is just
     misleading.
     In answer to your question:  Gupta's article misses the possibility of
     packages that are loaded but not in the search path.  In the notation of
     the first part of that article, loading a namespace just puts it in the
     middle two columns (i.e. creates the namespace and imports environments)
     without putting it in the search list.  That happens when you import or
     load a package without attaching it.  The search path imposes an ordering,
     things that aren't in it aren't ordered.
     Duncan Murdoch

     Regards
     Ben
     On 03/07/2014 11:46 AM, Duncan Murdoch wrote:

     On 07/03/2014 10:16 AM, Benjamin Tyner wrote:

     Hello,
     I realize that a function in <environment: base> (for example, function
     "head1" below) is unable to see (without resorting to "::", anyway)
     objects in utils (for example, "head" below), since package:base is
     after package:utils on the search path.

     However, I'm wondering what is the machinery that allows a function in
     <environment: namespace:base> (for example, function "head2" below) to
     be able to see "head" just fine, without needing to resort to "::".

     See Luke Tierney's article in R News,
     Name space management for R. Luke Tierney, R News, 3(1):2-6, June 2003
     [2]<http://cran.r-project.org/doc/Rnews/Rnews_2003-1.pdf>
     There's a link to it from the R help system.  Run help.start(), then
     look at "Technical papers" in the Miscellaneous Material section.
     I believe most of what it says is still current; the only thing I can
     see at a glance that is no longer correct is that in those days
     namespaces were optional in packages.  Now all packages have namespaces.
     Duncan Murdoch

     I'm also wondering more generally, why there is a need (practically
     speaking) for a distinction between the environment associated with a
     package and the environment associated with the namespace.
         $ export R_PROFILE=/home/btyner/Rprofile.site
         $ cat /home/btyner/Rprofile.site
         sys.source("/home/btyner/head1.R", envir = baseenv())
         sys.source("/home/btyner/head2.R", envir = .BaseNamespaceEnv)
         $ cat /home/btyner/head1.R
         head1 <- function(x) head(x)
         $ cat /home/btyner/head2.R
         head2 <- function(x) head(x)
         $ Rscript -e "head1(letters)"
         Error in head1(letters) : could not find function "head"
         Execution halted
         $ Rscript -e "head2(letters)"
         [1] "a" "b" "c" "d" "e" "f"
         $ Rscript -e "sessionInfo()"
         R version 3.0.1 (2013-05-16)
         Platform: x86_64-pc-linux-gnu (64-bit)
         locale:
          [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
          [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
          [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
          [7] LC_PAPER=C                 LC_NAME=C
          [9] LC_ADDRESS=C               LC_TELEPHONE=C
         [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
         attached base packages:
         [1] stats     graphics  grDevices utils     datasets  base
     Regards
     Ben
     ______________________________________________
     [3]R-help at r-project.org mailing list
     [4]https://stat.ethz.ch/mailman/listinfo/r-help
     PLEASE do read the posting guide
     [5]http://www.R-project.org/posting-guide.html
     and provide commented, minimal, self-contained, reproducible code.

     --
     //

   --
   

References

   1. mailto:R-core at r-project.org
   2. http://cran.r-project.org/doc/Rnews/Rnews_2003-1.pdf
   3. mailto:R-help at r-project.org
   4. https://stat.ethz.ch/mailman/listinfo/r-help
   5. http://www.R-project.org/posting-guide.html


More information about the R-help mailing list