How to run R scripts on servers without X11
linux, r, x11
Solution
I answered this once before -- can cannot make a program which expects X11 to certainly forget about it, but you can use the virtual framebuffer to 'pretend' X11 is present.
So see this older SO question for details and an example.
Problem
I want to run R scripts and save the plots using `png()`. X11 is not supported on the Unix servers and I get the following error message: ``` Error in X11(paste("png::", filename, sep = ""), g$width, g$height, pointsize, : unable to start device PNG Calls: png In addition: Warning message: In png("test.png", width = 900, height = 400) : unable to open connection to X11 display '' Execution halted ``` Setting environment variables ``` Sys.setenv("DISPLAY"=":0.0") ``` or ``` Sys.setenv("DISPLAY"=":0") ``` in the R scripts didn't solve the problem. This code example produces the error above: ``` library(ggplot2) library(grid) # Some data df = data.frame(x = c(1.2,5,3,5.3,2,9,4,6,8,0), y = c(1.5,6,2.5,5.1,2.3,8.7,4.1,6,8,0)) # Base plot p <- ggplot(df, aes(x,y)) + geom_point() + scale_x_continuous(limits = c(0, 8), expand = c(0,0)) + scale_y_continuous(limits = c(0, 8), expand = c(0,0)) + geom_smooth(method="lm", se=FALSE, formula=y~x, aes(colour="2"), show_guide=TRUE, fill=NA, size=1.2) + geom_vline(xintercept = 3) + geom_vline(xintercept = 7) + opts(plot.margin = unit(c(1,1,4,1), "lines")) # Create the text Grobs Text1 = textGrob("Part 1") Text2 = textGrob("Part 2") Text3 = textGrob("Part 3") # Add the annotations # Segment 1 p1 = p + annotation_custom(grob = linesGrob(), xmin = 0, xmax = 0, ymin = -1, ymax = -.75) + annotation_custom(grob = linesGrob(), xmin = 0, xmax = 3, ymin = -1, ymax = -1) + annotation_custom(grob = linesGrob(), xmin = 3, xmax = 3, ymin = -1, ymax = -.75) + annotation_custom(grob = Text1, xmin = 0, xmax = 3, ymin = -1.25, ymax = -1.25) # Segment 2 p1 = p1 + annotation_custom(grob = linesGrob(), xmin = 3, xmax = 7, ymin = -1, ymax = -1) + annotation_custom(grob = linesGrob(), xmin = 7, xmax = 7, ymin = -1, ymax = -.75) + annotation_custom(grob = Text2, xmin = 3, xmax = 7, ymin = -1.25, ymax = -1.25) # Segment 3 p1 = p1 + annotation_custom(grob = linesGrob(), xmin = 7, xmax = 8, ymin = -1, ymax = -1) + annotation_custom(grob = linesGrob(), xmin = 8, xmax = 8, ymin = -1, ymax = -.75) + annotation_custom(grob = Text3, xmin = 7, xmax = 8, ymin = -1.25, ymax = -1.25) png("test.png", width=900, height=400) # Code to override clipping gt <- ggplot_gtable(ggplot_build(p1)) gt$layout$clip[gt$layout$name=="panel"] <- "off" grid.draw(gt) dev.off() ``` The outcome of `capabilities()` is: ``` jpeg png tiff tcltk X11 aqua http/ftp sockets FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE libxml fifo cledit iconv NLS profmem cairo TRUE TRUE FALSE TRUE TRUE FALSE FALSE ``` I am running the scripts via a sun grid engine.