[Rd] evaluation in unattached namespace

Duncan Murdoch murdoch at stats.uwo.ca
Fri Apr 27 02:29:55 CEST 2007


On 4/26/2007 7:39 PM, Deepayan Sarkar wrote:
> Hi,
> 
> I recently discovered this buglet in lattice: If lattice is _not_
> attached, I get
> 
>> lattice::dotplot(~1:10)
> Error in eval(expr, envir, enclos) : could not find function "bwplot"
> 
> This happens because of this:
> 
>> lattice:::dotplot.formula
> function (x, data = NULL, panel = "panel.dotplot", ...)
> {
>     ocall <- ccall <- match.call()
>     ccall$data <- data
>     ccall$panel <- panel
>     ccall[[1]] <- as.name("bwplot")
>     ans <- eval.parent(ccall)
>     ans$call <- ocall
>     ans
> }
> <environment: namespace:lattice>
> 
> That is, ccall is eval()-ed in the global environment where bwplot is
> not visible. While this example is somewhat silly, similar things
> happen when I try to import lattice from another package.
> 
> Are there any simple alternatives? I tried
> 
>     ccall[[1]] <- as.name("lattice::bwplot")
> 
> but that didn't work either.

One way would be to create a new environment with the caller's 
environment as the parent, and put a copy of bwplot in it, i.e. 
something like the following untested code:

  function (x, data = NULL, panel = "panel.dotplot", ...)
  {
      ocall <- ccall <- match.call()
      ccall$data <- data
      ccall$panel <- panel
      ccall[[1]] <- as.name("bwplot")
      evalenv <- new.env(parent = parent.frame())
      assign("bwplot", bwplot, envir=evalenv)
      ans <- eval(ccall, envir=evalenv)
      ans$call <- ocall
      ans
  }

Duncan Murdoch



More information about the R-devel mailing list