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