Skip to content

alternatives to do.call() when namespace is attached but not loaded?

4 messages · Skye Bender-deMoll, Winston Chang, Hadley Wickham +1 more

#
Dear R-devel

I have a function in a package that essentially provides a wrapper for a 
group of functions in another Suggested package (it sets appropriate 
defaults for the context, transforms output, etc).  I've implemented 
this by verifying that the package was loaded with

require(sna)

and then

do.call(snaFunName, args = args)


The rDevel check is requesting that I use  requireNamespace(sna) instead 
of directly loading the SNA package. This seems reasonable, except that 
I have yet to figure out a way to use do.call to call the function when 
the namespace is attached but package is not loaded. 
do.call("sna::funName",..) doesn't seem to work.

1) Can do.call() call functions that are only namespace attached? Is 
there better way to accomplish this without do.call()? For example, 
should I use getAnywhere('funName') ('tho this doesn't seem to permit 
restricting search to a specific namespace..)

2) Is this an appropriate of require() instead of requireNamespace() to 
ensure that the Suggested package is loaded and attached? Can I ignore 
the check warning?

best,
  -skye
#
First, a clarification of terminology: a package can be loaded and
attached, or loaded and not attached. It can't be attached and not loaded.

To get the function from a package by name, you could do something like:
  getExportedValue("sna", snaFunName)

where snaFunName is a string containing the name of the function.

-Winston



On Tue, Feb 24, 2015 at 12:29 PM, Skye Bender-deMoll <skyebend at skyeome.net>
wrote:

  
  
#
do.call(sna::snaFunName, args = args)

?

Hadley

On Tue, Feb 24, 2015 at 1:29 PM, Skye Bender-deMoll
<skyebend at skyeome.net> wrote:

  
    
#
I was about to suggest something similar. The key is that the first arg to do.call is not necessarily a text string; it can be the actual function object. So something along the lines of 

name <- as.name("snaFunName")
f <- eval(bquote(sna::.(name)))
do.call(f, args)

should work too.