From ripley at stats.ox.ac.uk  Thu Oct 16 21:06:44 2003
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Thu Oct 16 21:05:50 2003
Subject: [Rd] data() misbehaving inside a function
In-Reply-To: <20031016141029.A22651@jessie.research.bell-labs.com>
Message-ID: <Pine.LNX.4.44.0310162000330.8820-100000@gannet.stats>

Yes, but this is not to do with being inside a function:

pkg <- "base"
data(package=pkg)

ilustrates it, and library etc behave in the same way (except
library can make use of character.only = TRUE).

You can use substitute, too, as in

foo <- function(pkg) eval(substitute(data(package = pkg), list(pkg=pkg)))


On Thu, 16 Oct 2003, David James wrote:

> Calls of the form data(package = pkg) inside a function 
> incorrectly fail ("pkg" is a local variable).  For instance,
> 
>    foo <- function(pkg) data(package = pkg)
>    foo("base")
>    Error in .find.package(package, lib.loc, verbose = verbose) :
>            none of the packages were found
> 
>    ## workaround -- force argument "package" to be an expression
>    ## (not a name)
> 
>    foo <- function(pkg) data(package = as.character(pkg))
>    all.equal(data(package = "base"), foo("base"))
>    [1] TRUE
> 
> The cause is the following piece of code inside data()
> 
>     > print(data)
>     .... 
>     if (!missing(package))
>                if (is.name(y <- substitute(package)))
>                               package <- as.character(y)
>     ...
> 
> namely, when data() is invoked from within a function, e.g.,
> data(package = pkg), the argument "package" inside data() is indeed
> a name, but not one that should be coerced to character as when one
> types data(base) from the R prompt, but rather simply a variable
> in the calling function; in the example above, the arg "package"
> to data() is effectively computed to be "pkg", which (luckily)
> does not correspond to any attached package.
> 
> version
>        _
> platform i686-pc-linux-gnu
> arch     i686
> os       linux-gnu
> system   i686, linux-gnu
> status   Patched
> major    1
> minor    8.0
> year     2003
> month    10
> day      13
> language R
> 
> 

-- 
Brian D. Ripley,                  ripley@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595


[Rd] data() misbehaving inside a function
Prof Brian Ripley