2012-10-25 33 views
17

Tôi muốn chạy tập lệnh R và lưu các ô bằng cách sử dụng png(). X11 không được hỗ trợ trên các máy chủ Unix và tôi nhận được thông báo lỗi sau:Cách chạy tập lệnh R trên máy chủ không có 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 

Thiết biến môi trường

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

hoặc

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

trong kịch bản R không giải quyết vấn đề.

mã ví dụ này tạo ra các lỗi trên:

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

Kết quả của capabilities() là:

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 

Tôi đang chạy các kịch bản thông qua một động cơ lưới trời.

+0

Được R thậm chí biên soạn với sự hỗ trợ X11? Kiểm tra 'khả năng()' trên máy chủ. IIRC bạn có thể có bộ đệm khung ảo X thay vì X cho phép nó hoạt động, nhưng giả định rằng gói/phần mềm framebuffer ảo X được cài đặt trên máy chủ (trên Linux, Fedora tôi có thể cài đặt xorg-x11-server-Xvfb cho Mục đích này). Nếu thất bại, hãy tìm một thiết bị đồ họa được máy chủ của bạn hỗ trợ, vẽ đồ thị đó và truy xuất tệp rồi chuyển đổi sang PNG trên hệ thống cục bộ của bạn –

+1

Bạn kết nối với máy chủ như thế nào? Tôi nghĩ rằng 'ssh' có một tùy chọn để bật hoặc tắt đường hầm X11. –

+0

jpeg png tiff tcltk X11 thủy http/ftp socket FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE libxml fifo cledit iconv NLS profmem cairo TRUE FALSE TRUE TRUE TRUE FALSE FALSE –

Trả lời

3

Tôi đã trả lời câu hỏi này một lần trước đây - không thể tạo một chương trình mong muốn X11 quên nó, nhưng bạn có thể sử dụng bộ đệm khung ảo để 'giả vờ' X11.

Vì vậy, hãy xem this older SO question để biết chi tiết và ví dụ.

20

nếu bạn đang sử dụng R 3.0, thử options(bitmapType='cairo') nó làm việc cho tôi

+1

Bạn đã đặt địa điểm đó ở đâu? Trước hoặc sau cuộc gọi png() hoặc ở nơi khác? –

+0

Tôi đặt nó trước khi gọi png() và một lần là đủ cho tất cả các cuộc gọi png(). Xin lỗi vì câu trả lời bị chậm – svural

+1

Xin chào, đây là giải pháp duy nhất có hiệu quả đối với tôi. – lourencoj

Các vấn đề liên quan