2008/10/31 Duncan Murdoch <[EMAIL PROTECTED]>: > On 10/30/2008 10:44 AM, Duncan Murdoch wrote: >> >> On 10/30/2008 10:15 AM, Martin Maechler wrote: >>>>>>>> >>>>>>>> "FA" == Felix Andrews <[EMAIL PROTECTED]> >>>>>>>> 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: * checking package dependencies ... ERROR Namespace dependencies not required: RGtk2 > > Duncan Murdoch > > ______________________________________________ > R-devel@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@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel