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
Duncan Murdoch
2011-Aug-08 12:19 UTC
[Rd] Overwriting imported function in another package
On 08/08/2011 7:02 AM, Jeroen Ooms wrote:> 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?Yes, modify the source and recompile R. Duncan Murdoch> #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 > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel