Re: [Rd] conditionally import a namespace?

From: Felix Andrews <felix_at_nfrac.org>
Date: Fri, 31 Oct 2008 18:09:52 +1100

2008/10/31 Duncan Murdoch <murdoch_at_stats.uwo.ca>:

> On 10/30/2008 10:44 AM, Duncan Murdoch wrote:

>>
>> On 10/30/2008 10:15 AM, Martin Maechler wrote:
>>>>>>>>
>>>>>>>> "FA" == Felix Andrews <felix_at_nfrac.org>
>>>>>>>> on Thu, 30 Oct 2008 17:40:17 +1100 writes:
>>>
>>> FA> Dear R-devel,
>>> FA> I have a problem defining the dependencies for a package.
>>>
>>> FA> My package (latticist, not yet released) "Suggests" RGtk2, but
>>> FA> specifically does not require it. If RGtk2 is available, the user
>>> can
>>> FA> call a function that builds a GUI with RGtk2. However, I do not
>>> want
>>> FA> to attach the RGtk2 namespace, because it is irrelevant to the
>>> user
>>> FA> and exports about 7500 symbols.
>>>
>>> FA> Last time I asked a similar question to this, Professor Ripley
>>> noted
>>> FA> that the usual method to get around this situation is the use an
>>> FA> explicit package prefix to function calls (the `::` operator). But
>>> FA> this is not so easy with non-standard functions. Take this chunk
>>> of
>>> FA> code:
>>>
>>> FA> widg <- gtkComboBoxEntryNewText()
>>> FA> widg$show()
>>> FA> widg["width-request"] <- 100
>>>
>>> FA> The first call is easy to prefix, as
>>> RGtk2::gtkComboBoxEntryNewText()
>>> FA> but the others, `$.RGtkObject` and `[<-.RGtkObject` are not.
>>>
>>> indeed.
>>>
>>> FA> While I *could* rewrite all the code to use explicit functions, I
>>> FA> think, the resulting code would be much less clear.
>>>
>>> FA> Essentially what I want to do is conditionally import the RGtk2
>>> namespace.
>>> FA> Any suggestions?
>>>
>>> Maybe something along the line of
>>>
>>> if(is.function(try(RGtk2::gtkComboBoxEntryNewText))) {
>>> library(RGtk2)
>>> ....
>>> ....
>>> }
>>>
>>> ??
>>
>> I think the problem is that that puts the namespace on the user's search
>> list, which is what Felix wanted to avoid. He would like to import(RGtk2),
>> but only if it exists.
>>
>> There are conditionals allowed in NAMESPACE files, but I don't know if
>> they are allowed to be used to control imports. They are not well
>> documented -- they were called "experimental" when introduced in 1.9.0.
>>
>> If this is allowed, then something like
>>
>> if( "RGtk2" %in% rownames(installed.packages()) ) {
>> import(RGtk2)
>> }
>>
>> should work.
>
> I just did a little test, and it does appear to work if you use
> utils::installed.packages in the condition.  And one clarification: those
> lines go into your NAMESPACE file, not into R code.

Many thanks Duncan, that is just what I wanted. The only problem now is that it fails R CMD check:

>
> Duncan Murdoch
>
> ______________________________________________
> R-devel_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



-- 
Felix Andrews / 安福立
http://www.neurofractal.org/felix/
3358 543D AAC6 22C2 D336  80D9 360B 72DD 3E4C F5D8

______________________________________________
R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Fri 31 Oct 2008 - 07:12:59 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 31 Oct 2008 - 10:30:34 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive