[Rd] operator :: and symbols not in the namespace of a package with a namespace (PR#9279)

Luke Tierney luke at stat.uiowa.edu
Fri Oct 6 16:44:53 CEST 2006


On Fri, 6 Oct 2006, Duncan Murdoch wrote:

> On 10/6/2006 9:05 AM, thomas.friedrichsmeier at rub.de wrote:
>> Full_Name: Thomas Friedrichsmeier
>> Version: 2.4.0
>> OS: GNU/Linux
>> Submission from: (NULL) (84.61.116.51)
>>
>>
>> Since R 2.4.0, operator "::" also returns objects in the package environment, if
>> the package does not have a namespace. This is a very welcome addition.
>>
>> Additional wish:
>> If a package has a namespace, but does not place all symbols in that namespace,
>> lookup will still fail. For example in package boot (version 1.2-26):
>>
>> library (boot)
>> exists ("motor", envir=as.environment ("package:boot"))   # TRUE
>> getAnywhere ("motor")                                     # found in
>> package:boot
>> boot::motor                                               # error not in
>> namespace
>>
>> This is as documented, but I think it would be convenient, if boot::motor would
>> also return the object in this case.
>
> At first I was ready to disagree with you, telling you to use the ":::"
> operator for something that is not exported:  but in fact motor is a
> dataset, so it is exported from the package by being loaded into the
> package environment when the package is loaded.  I agree that the "::"
> operator should find it.

It might be a good idea to rethink the decision to have data be
handled specially instead of having data sets be treated as ordinary
exported variables.  There may be a good reason for doing what we do
now but I don't know what it is.  If there really is a good reason to
continue this then maybe we should think about this addition.  It
doesn't feel like the right thing to do but may be harmless.

> I think the rule should be:  the "::" operator looks at the symbols that
> are publicly available from the package, i.e. boot::motor should
> effectively be an abbreviation for
>
> get("motor", pos="package:boot", inherits=FALSE)
>
> after making sure boot is loaded.  I think getExportedValue() is a much
> more rarely needed function, so users should need to use it explicitly.

No. :: exists precisely to allow code to access exported variables
without attaching the namespace.  It is the only way I use this feature
and the reason the feature exists.

Best,

luke



>
> Duncan Murdoch
>
>>
>> This might be achieved by adding an additional tryCatch in "::": If the package
>> has a namespace, try getExportedValue (), if that fails, try to get from package
>> environment instead. E.g.:
>>
>> "::" <- function (pkg, name)
>> {
>>     pkg <- as.character(substitute(pkg))
>>     name <- as.character(substitute(name))
>>     ns <- tryCatch(asNamespace(pkg), hasNoNamespaceError = function(e) NULL)
>>     if (is.null(ns)) {
>>         pos <- match(paste("package", pkg, sep = ":"), search(),
>>             0)
>>         if (pos == 0)
>>             stop(gettextf(paste("package '%s' has no name space and",
>>                 "is not on the search path"), pkg), domain = NA)
>>         get(name, pos = pos, inherits = FALSE)
>>     }
>>     else tryCatch(getExportedValue(pkg, name), error=function (e) {
>>                        pos <- match(paste("package", pkg, sep=":"), search(),
>> 0)
>>                        get(name, pos, inherits=FALSE)
>>                   })
>> }
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:      luke at stat.uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu




More information about the R-devel mailing list