Как запускать 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")
или
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
Я запускаю скрипты с помощью механизма солнечной сетки.
Ответы
Ответ 1
Я ответил на это один раз раньше - can не может сделать программу, которая ожидает, что X11, конечно, забудет об этом, но вы можете использовать виртуальный фреймбуфер, чтобы "притвориться" X11 присутствует.
См. этот старый вопрос SO для получения более подробной информации и примера.
Ответ 2
если вы используете R 3.0, попробуйте options(bitmapType='cairo')
это сработало для меня