From jeroen.ooms at stat.ucla.edu  Mon Aug  8 13:02:52 2011
From: jeroen.ooms at stat.ucla.edu (Jeroen Ooms)
Date: Mon, 8 Aug 2011 13:02:52 +0200
Subject: [Rd] Overwriting imported function in another package
Message-ID: <CABFfbXvuYi=nYQ72ULVyQX87q288Wu7jAioPMXmBhKU6EvcJ+g@mail.gmail.com>

I am running into a limitation of the grid::grid.newpage function, for
which I would like to overwrite this function with a slightly modified
one. Hopefully this is a temporary working solution until the package
gets updated. I found a way to overwrite the function in the
package:grid namespace. However, lattice imports grid rather than
depending on it. So I need a way to overwrite this imported version as
well. The code below shows the fix which works for ggplot (because it
depends on grid), but it doesn't work for lattice, because it imports
grid. Is there any way to overwrite grid.newpage for all
instantiations of it?

#packages
library(grid);
library(lattice);
library(ggplot2);

#create the modified function.
hookfun <- deparse(body(plot.new))[1:6]
oldfun <- deparse(body(grid::grid.newpage))[-1];
newfun <- grid::grid.newpage;
body(newfun) <- parse(text=c(hookfun, oldfun));

#overwrite it in the package
unlockBinding("grid.newpage", as.environment("package:grid"))
assign("grid.newpage", newfun, pos="package:grid")

#this seems ok:
get('grid.newpage', as.environment("package:grid"));
get('grid.newpage', as.environment("package:lattice"));

#but this is still the old one
get('grid.newpage', environment(histogram));

#test if it worked:
setHook("before.plot.new", function() {message("Yay! A new plot.");});
qplot(rnorm(100)); #it worked for ggplot2
histogram(rnorm(100)); #didn't work for lattice



[Rd] Overwriting imported function in another package
Jeroen Ooms