2011-08-13 20 views
12

Trong phiên bản R cũ hơn, phiên bản 2.9, tôi có thể chạy chương trình R từ hàng loạt bằng rterm.exe và tạo cửa sổ đồ họa mà người dùng có thể cuộn qua lại và xem biểu đồ. Tôi có thể làm điều đó bằng cách sử dụng một số mã R như:getGraphicsEvent để đọc bảng chính cho phiên không tương tác

kbd <- function(key) { 
if (key == "q") { "Quit" } else NULL } 
getGraphicsEvent(" ", onKeybd = kbd) 

Điều này giúp người xem đồ họa mở cho đến khi người dùng nhấn phím "q". Trong phiên bản mới hơn của R, có vẻ như là vì điều này được bắt đầu từ lô (không tương tác bằng Rterm.exe), giá trị khóa luôn là NULL và cửa sổ đồ họa chỉ đơn giản là nhấp nháy và đóng. Câu hỏi của tôi là nếu có bất kỳ cách nào tôi bằng cách nào đó có thể thuyết phục hệ thống R rằng tôi đang chạy một phiên tương tự và nhận được hành vi của getGraphicsEvent để không trả về NULL ngay lập tức?

+0

Bạn có thể cung cấp thêm một số mã để chứng minh đầy đủ vấn đề không? Ví dụ từ '? GetGraphicsEvent' hoạt động cho tôi trong' Rterm.exe'. –

+0

Tôi không thể giúp đỡ nhưng tôi tò mò là tại sao bạn lại sử dụng một cách tiếp cận như vậy. Tôi đã sử dụng R trong vài năm nay và chủ yếu được phát triển bằng Rstudio và không thưởng thức đồ họa nhiều, nhưng gần đây tôi đang nhìn vào thư viện sáng bóng và cực kỳ dễ dàng để xây dựng các ứng dụng tương tác. Có lẽ nếu bạn có sự linh hoạt, bạn có thể nhìn vào sáng bóng. –

Trả lời

0

Đây là mã nguồn cho getGraphicsEvent:

 
function (prompt = "Waiting for input", onMouseDown = NULL, onMouseMove = NULL, 
    onMouseUp = NULL, onKeybd = NULL, consolePrompt = prompt) 
{ 

    if (!interactive()) 
     return(NULL) 
    if (!missing(prompt) || !missing(onMouseDown) || !missing(onMouseMove) || 
     !missing(onMouseUp) || !missing(onKeybd)) { 
     setGraphicsEventHandlers(prompt = prompt, onMouseDown = onMouseDown, 
      onMouseMove = onMouseMove, onMouseUp = onMouseUp, 
      onKeybd = onKeybd) 
    } 
    .External2(C_getGraphicsEvent, consolePrompt) 
} 

Bạn có thể thấy lý do tại sao nó trả về NULL, vì đó là làm rõ với if (!interactive()) return(NULL). Hãy thử điều này chèn vào mã ban đầu của bạn:

 

getGraphicsEvent2 = function (prompt = "Waiting for input", onMouseDown = NULL, onMouseMove = NULL, 
    onMouseUp = NULL, onKeybd = NULL, consolePrompt = prompt) 
{ 

    # if (!interactive()) 
    #  return(NULL) 
    if (!missing(prompt) || !missing(onMouseDown) || !missing(onMouseMove) || 
     !missing(onMouseUp) || !missing(onKeybd)) { 
     setGraphicsEventHandlers(prompt = prompt, onMouseDown = onMouseDown, 
      onMouseMove = onMouseMove, onMouseUp = onMouseUp, 
      onKeybd = onKeybd) 
    } 
    .External2(C_getGraphicsEvent, consolePrompt) 
} 
environment(getGraphicsEvent2) = environment(grDevices::getGraphicsEvent) 

dragplot(rnorm(1000), rnorm(1000)) 


kbd = function(key) { 
if (key == "q") { "Quit" } else NULL } 
getGraphicsEvent2("Waiting for input", onKeybd = kbd) 

Dường như để mất chức năng (ví dụ: Tôi không thể thao tác các âm mưu trên OSX với X11 như thiết bị đồ họa), nhưng ít nhất cốt truyện vẫn lên. Cuộc gọi đến mã nội bộ cho hàm này đã thay đổi gần đây (để xác nhận, xem mã nguồn cho R trong hai phiên bản - mã cho hàm này trong R 2.6.2, ví dụ là tại R-2.6.2/src/library/grDevices /R/gevents.R).

1

Bạn có thể giả mạo một phiên tương tác trong một mà có thể được phát hiện như không tương tác bằng cách bắt đầu Rterm với các tùy chọn

--ess 

trên Windows, hoặc

--interactive 

trên Unix-alikes.

Điều này có thể gây ra các sự cố khác, vì tất cả các chức năng sẽ thấy phiên là tương tác. Bạn không thể thay đổi cờ đó ở giữa một phiên, vì nó ảnh hưởng đến rất nhiều thứ liên quan đến I/O.

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