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

21

Я хочу запустить 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")

или

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

Я запускаю скрипты с помощью механизма солнечной сетки.

    
задан Matthias Munz 25.10.2012 в 13:38
источник
  • Был ли R составлен с поддержкой X11? Проверьте возможности () на сервере. IIRC у вас может быть X виртуальный фреймбуфер вместо X, который позволит этому работать, но предполагается, что на сервере установлен пакет / программное обеспечение виртуального фреймбуфера X (в Linux, Fedora я могу установить xorg-x11-server-Xvfb для этой цели). Если это не удается, найдите графическое устройство, поддерживаемое вашим сервером, запишите его и извлеките файл, а затем конвертируйте в PNG в локальной системе –  Gavin Simpson 25.10.2012 в 13:54
  • Как вы подключились к серверу? Я думаю, что ssh имеет возможность включить или выключить туннелирование X11. –  Ari B. Friedman 25.10.2012 в 13:56
  • jpeg png tiff tcltk X11 aqua http / ftp сокеты FALSE FALSE FALSE TRUE FALSE FALSE ИСТИНА ИСТИНА libxml fifo cledit iconv NLS profmem cairo ИСТИНА ИСТИНА FALSE TRUE TRUE FALSE FALSE –  Matthias Munz 25.10.2012 в 15:19
  • Какая версия R вы? Если я отключу DISPLAY и запустим R, я могу сделать: png (file="foo.png"); plot (1:10); dev.off () и получить PNG, даже если я не могу разговаривать с моим сервером X11 (который я проверяю, потому что X11 () не работает). Я считаю, что png использует cairo, если нет X11, если у вас есть каир в ваших возможностях. Который я не думаю, что вы делаете. Возьми. –  Spacedman 25.10.2012 в 15:40

2 ответа

3

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

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

    
ответ дан Dirk Eddelbuettel 25.10.2012 в 15:40
26

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

    
ответ дан svural 11.11.2013 в 23:04
  • Где вы это разместили? До или после вызова png () или где-то еще? –  Samuel Lampa 01.03.2014 в 20:44
  • Я поместил его перед вызовом png (), и один раз достаточно для всех вызовов png (). Извините за задержанный ответ –  svural 04.06.2014 в 20:53
  • Привет, это единственное решение, которое сработало для меня. –  lourencoj 06.05.2016 в 12:05
  • Мне пришлось добавить опции (bitmapType = 'cairo') в мой ~ / .Rprofile –  Shaun Jackman 07.07.2017 в 02:58