[R-pkg-devel] Force namespace prefix for a loaded package function

Tim Keitt tkeitt at utexas.edu
Tue Jun 28 02:04:57 CEST 2016


http://www.keittlab.org/

On Mon, Jun 27, 2016 at 5:18 PM, Duncan Murdoch <murdoch.duncan at gmail.com>
wrote:

> On 27/06/2016 5:46 PM, Tim Keitt wrote:
>
>>
>>
>> http://www.keittlab.org/
>>
>> On Mon, Jun 27, 2016 at 10:19 AM, Duncan Murdoch
>> <murdoch.duncan at gmail.com <mailto:murdoch.duncan at gmail.com>> wrote:
>>
>>     On 27/06/2016 11:08 AM, Tim Keitt wrote:
>>
>>         http://www.keittlab.org/
>>
>>         On Mon, Jun 27, 2016 at 3:22 AM, Joris Meys <jorismeys at gmail.com
>>         <mailto:jorismeys at gmail.com>> wrote:
>>
>>         > If you want to call a non exported function, you need three
>> colons
>>         >
>>         > X:::f ()
>>         >
>>         > And frankly, that is a bad idea.
>>         >
>>         I think you missed the point (and stated the obvious).
>>
>>         A well-designed namespace feature would give control of imports
>>         to the code
>>         user, not the code writer.
>>
>>         Right now, I have to avoid all the function names in base
>>         because I will
>>         cause a collision. If I want to have an "options" function in my
>>         package, I
>>         have to make it "pkgname_options" rather than pkgname::options,
>>         which is
>>         greatly preferable and would allow the user to decide whether
>>         they want to
>>         import it and then simply use "options" and "base::options".
>>
>>         I've always considered this all-or-nothing approach to imports a
>>         bug in the
>>         implementation of namespaces in R. I was trying to suggest that
>>         it be
>>         fixed. (Probably should have sent this to r-devel actually.)
>>
>>
>>     The base package is special, but for all other packages there's no
>>     "all-or-nothing" approach to imports, so your statement about a
>>     function named "options" doesn't really make sense.  If you want to
>>     do that, just do it, and other packages that prefer your
>>     implementation to the base one can import just that one function, or
>>     do the import at run time by calling it as pkgname::options().
>>
>>
>> I know that. I mean for someone writing a script, not a package.
>>
>> Its all good for package writers. Its quite simple to control imports
>> there. But not so much for someone using the package in R to write a
>> script. You either go with package_name::object for everything or you
>> call "library" and you get everything the packager exported.
>>
>> It would be nice to 1) be able to hold back some functions from being
>> fully exported in a package and (maybe or) 2) extend the functionality
>> of the NAMESPACE file to the user session via a set of functions.
>>
>> Does that make any more sense?
>>
>
> It makes a little more sense, but it's still not correct.  If you want to
> do the equivalent of importing foo::options, just add the line
>
> options <- foo::options
>
> at the start of your script.  This "imports" that one function, and
> nothing else from the foo namespace.
>
> It has the side effect of leaving the options object in the current
> workspace afterwards.  If that concerns you, use local():
>
> local( {
>   options <- foo::options
>   # Lots of calculations, computing result
>   result
> })
>

Good one. Yes, that is more of what I had in mind.

I suppose I really want C++-like namespaces because I tend to think that
way.

THK


>
> Duncan Murdoch
>
>
>
>> THK
>>
>>
>>
>>     Duncan Murdoch
>>
>>
>>         THK
>>
>>
>>
>>         > Cheers
>>         > Joris
>>         > On 26 Jun 2016 19:37, "Tim Keitt" <tkeitt at utexas.edu
>>         <mailto:tkeitt at utexas.edu>> wrote:
>>         >
>>         >> It would be rather nice if we could define functions in our
>>         packages that
>>         >> must be called with the namespace prefix.
>>         >>
>>         >> I'd like to do
>>         >>
>>         >> #' @protected (or some such)
>>         >> f = function(...) list(...)
>>         >>
>>         >> in package scope and then
>>         >>
>>         >> library(x)
>>         >> f(1)             # fails
>>         >> x::f(1)         # succeeds
>>         >>
>>         >> Currently unless I am missing something, a function is either
>>         exported to
>>         >> global scope or not available. This could be done if package
>>         loading made
>>         >> two environments, one in the path and another not in the
>>         path, and then
>>         >> have the namespace prefix search both in succession.
>>         >>
>>         >> Yes, you could do
>>         >>
>>         >> #' @export
>>         >> x_f = function(...) list(...)
>>         >>
>>         >> library(x)
>>         >> x_f(1)
>>         >>
>>         >> but I would prefer reusing the namespace prefix syntax.
>>         >>
>>         >> This would also avoid name collisions between package, which
>>         ideally is
>>         >> the
>>         >> purpose of a namespace.
>>         >>
>>         >> I suppose also you could make two packages and list one in
>>         Imports: but I
>>         >> find that less satisfying because it requires a different
>>         namespace
>>         >> prefix.
>>         >>
>>         >> Or am I missing something obvious here.
>>         >>
>>         >> THK
>>         >>
>>         >> http://www.keittlab.org/
>>         >>
>>         >>         [[alternative HTML version deleted]]
>>         >>
>>         >> ______________________________________________
>>         >> R-package-devel at r-project.org
>>         <mailto:R-package-devel at r-project.org> mailing list
>>         >> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>>         >>
>>         >
>>
>>                 [[alternative HTML version deleted]]
>>
>>         ______________________________________________
>>         R-package-devel at r-project.org
>>         <mailto:R-package-devel at r-project.org> mailing list
>>         https://stat.ethz.ch/mailman/listinfo/r-package-devel
>>
>>
>>
>>
>>
>

	[[alternative HTML version deleted]]



More information about the R-package-devel mailing list