2012-10-25 8 views
17

Voglio eseguire gli script R e salvare i grafici utilizzando png(). X11 non è supportato sui server Unix e ottengo il seguente messaggio di errore:Come eseguire gli script R sui server senza X11

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 

delle variabili di ambiente

Sys.setenv("DISPLAY"=":0.0") 

o

Sys.setenv("DISPLAY"=":0") 

negli script di R non ha risolto il problema.

Questo esempio di codice genera l'errore precedente:

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() 

Il risultato di capabilities() è:

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 

Sono in esecuzione gli script tramite un motore griglia sole.

+0

era la R anche compilato con il supporto X11? Controlla 'capabilities()' sul server. IIRC puoi avere un X framebuffer virtuale invece di X che permetterà a questo di funzionare, ma questo presuppone che il pacchetto/software virtuale di framebuffer X sia installato sul server (su Linux, Fedora posso installare xorg-x11-server-Xvfb per questo scopo). Se fallisce, trova un dispositivo grafico supportato dal tuo server, traccia a quello e recupera il file e poi converti in PNG sul tuo sistema locale. –

+1

Come sei connesso al server? Penso che 'ssh' abbia un'opzione per attivare o disattivare il tunneling X11. –

+0

jpeg png tiff tcltk X11 aqua http/ftp prese FALSO FALSO FALSO VERO FALSO FALSO VERO VERO libxml FIFO cledit iconv NLS profmem cairo VERO VERO FALSO VERO VERO FALSO FALSO –

risposta

3

Ho risposto una volta prima - non posso fare un programma che si aspetta che X11 si dimentichi di esso, ma puoi usare il framebuffer virtuale per 'fingere' che X11 sia presente.

Quindi vedere this older SO question per dettagli e un esempio.

20

se si utilizza R 3.0, provare options(bitmapType='cairo') ha funzionato per me

+1

Dove l'hai piazzato? Prima o dopo la chiamata png() o altrove? –

+0

L'ho messo prima della chiamata png() e una volta è sufficiente per tutte le chiamate png(). Scusa per la risposta ritardata – svural

+1

Ciao, questa è l'unica soluzione che ha funzionato per me. – lourencoj

Problemi correlati