Как запускать R-скрипты на серверах без X11

Я хочу запускать сценарии R и сохранять графики, используя png(). X11 не поддерживается на серверах Unix, и я получаю следующее сообщение об ошибке:

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

Установка переменных окружения

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

or

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

в сценариях R не решили проблему.

Этот пример кода приводит к указанной выше ошибке:

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

Результат 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

Я запускаю сценарии через двигатель солнечной сетки.


person Matthias Munz    schedule 25.10.2012    source источник
comment
Был ли R скомпилирован с поддержкой X11? Проверьте capabilities() на сервере. IIRC у вас может быть виртуальный фреймбуфер X вместо X, который позволит этому работать, но это предполагает, что пакет/программное обеспечение виртуального фреймбуфера X установлено на сервере (в Linux, Fedora я могу установить xorg-x11-server-Xvfb для этой цели). Если это не удается, найдите графическое устройство, поддерживаемое вашим сервером, нарисуйте его и извлеките файл, а затем преобразуйте его в PNG в вашей локальной системе.   -  person Gavin Simpson    schedule 25.10.2012
comment
Как вы подключены к серверу? Я думаю, что у ssh есть возможность включить или отключить туннелирование X11.   -  person Ari B. Friedman    schedule 25.10.2012
comment
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   -  person Matthias Munz    schedule 25.10.2012
comment
Какая у вас версия R? Если я отключу DISPLAY и запущу R, я смогу сделать: png(file=foo.png);plot(1:10);dev.off() и получить PNG, даже если я не могу связаться со своим сервером X11 (который Я проверяю, потому что X11() не работает). Я считаю, что png использует cairo, если нет X11, если у вас есть cairo в ваших возможностях. Что, я думаю, ты не делаешь. Возьми.   -  person Spacedman    schedule 25.10.2012


Ответы (2)


Я ответил на это однажды раньше - не может создать программу, которая ожидает, что X11 обязательно забудет об этом, но вы можете использовать виртуальный фреймбуфер, чтобы «притвориться», что X11 присутствует.

Итак, см. этот старый вопрос SO для получения подробной информации и примера.

person Dirk Eddelbuettel    schedule 25.10.2012

если вы используете R 3.0, попробуйте options(bitmapType='cairo') у меня сработало

person svural    schedule 11.11.2013
comment
Где ты это разместил? До или после вызова png() или где-то еще? - person Samuel Lampa; 01.03.2014
comment
Я поместил его перед вызовом png(), и одного раза достаточно для всех вызовов png(). Извините за задержку ответа - person svural; 04.06.2014
comment
Привет, это единственное решение, которое сработало для меня. - person lourencoj; 06.05.2016
comment
Мне пришлось добавить options(bitmapType='cairo') к ~/.Rprofile - person Shaun Jackman; 07.07.2017
comment
великолепно, это сработало и для меня в нашем кластере. Большое спасибо - person Garini; 06.11.2018