當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R getGraphicsEvent 等待來自圖形窗口的鼠標或鍵盤事件


R語言 getGraphicsEvent 位於 grDevices 包(package)。

說明

該函數以鼠標或鍵盤事件的形式等待來自圖形窗口的輸入。

用法

getGraphicsEvent(prompt = "Waiting for input",
                 onMouseDown = NULL, onMouseMove = NULL,
                 onMouseUp = NULL, onKeybd = NULL,
                 onIdle = NULL,
                 consolePrompt = prompt)
setGraphicsEventHandlers(which = dev.cur(), ...)
getGraphicsEventEnv(which = dev.cur())
setGraphicsEventEnv(which = dev.cur(), env)

參數

prompt

在圖形窗口中向用戶顯示提示

onMouseDown

響應鼠標點擊的函數

onMouseMove

響應鼠標移動的函數

onMouseUp

響應鼠標按鈕釋放的函數

onKeybd

響應按鍵的函數

onIdle

當沒有事件待處理時調用的函數

consolePrompt

在控製台中向用戶顯示提示

which

該調用適用於哪個圖形設備?

...

包括要放置在事件環境中的處理程序的項目

env

用作事件環境的環境

細節

這些函數允許用戶從某些圖形設備(目前僅windows(),X11(type = "Xlib")X11(type = "cairo")底座上的屏幕顯示R)。可以安裝事件處理程序來響應涉及鼠標或鍵盤的事件。

各函數的關係如下。如果前六個參數中的任何一個getGraphicsEvent給出,然後它在調用中使用這些setGraphicsEventHandlers替換當前設備中任何現有的處理程序。這是為了與 2.12.0 之前的版本兼容R版本。當前設置事件處理程序的常規方法是使用setGraphicsEventHandlers或者setGraphicsEventEnv在一個或多個圖形設備上,然後使用getGraphicsEvent()不帶參數來檢索事件數據。getGraphicsEventEnv()可用於保存事件環境以供以後使用。

getGraphicsEvent 中的參數名稱很特殊。處理事件時,圖形係統將在事件環境中查找名為 onMouseDownonMouseMoveonMouseUponKeybdonIdle 的函數,並將它們用作事件處理程序。它將使用 prompt 作為圖形設備上的標簽。另外兩個特殊名稱是 which ,它將標識圖形設備,以及 result ,其中最後一個事件處理程序的結果將在 getGraphicsEvent() 返回之前存儲在其中。

鼠標事件處理程序應該是帶有標題 function(buttons, x, y) 的函數。坐標 xy 將被傳遞到設備獨立坐標中的鼠標事件處理程序(即窗口的左下角是 (0,0) ,右上角是 (1,1) )。 buttons 參數將是一個向量,列出事件發生時按下的按鈕,其中 0 表示左側,1 表示中間,2 表示右側。

鍵盤事件處理程序應該是帶有標題 function(key) 的函數。與按鍵相對應的單個元素字符向量將傳遞給此處理程序。 Shift 和其他修飾鍵將被處理,因此 shift-a 將作為 "A" 傳遞。以下特殊鍵也可以傳遞給處理程序:

  • 控製鍵,作為 "Ctrl-A" 等傳遞。

  • 導航鍵,作為其中之一傳遞
    "Left", "Up", "Right", "Down", "PgUp", "PgDn", "End", "Home"

  • 編輯鍵,作為 "Ins", "Del" 之一傳遞

  • 函數鍵,作為 "F1", "F2", ... 之一傳遞

空閑事件處理程序onIdle 應該是一個不帶參數的函數。如果函數未定義或 NULL ,那麽 R 通常會調用一個係統函數,該函數(有效地)等待下一個事件出現在文件句柄上。否則,隻要發現圖形設備的事件隊列為空,即處於無限循環中,就會調用空閑事件處理程序。此函數旨在允許動畫響應用戶輸入,並且可能會占用 CPU 資源。目前,onIdle 僅針對X11() 設備實現。

請注意,不建議在空閑處理程序中調用 Sys.sleep() - Sys.sleep() 會刪除掛起的圖形事件,以便允許用戶在執行時移動、關閉或調整窗口大小。 Sys.sleep() 期間發生的鼠標和鍵盤事件等事件會丟失,並且當前不會觸發通過 getGraphicsEventsetGraphicsEventHandlers 注冊的事件處理程序。

事件處理程序是標準 R 函數,並且將像從事件環境調用一樣執行。

在交互式會話中,事件將被處理,直到

  • 事件處理程序之一返回非 NULL 值,該值將作為 getGraphicsEvent 的值返回,或

  • 用戶從控製台中斷該函數。

以交互方式運行時,getGraphicsEvent 返回從事件處理程序之一返回的非 NULL 值。在非交互式會話中,getGraphicsEvent 將立即返回NULL。如果用戶關閉最後一個具有圖形處理程序的窗口,它還將返回NULL

getGraphicsEventEnv 返回圖形設備的當前事件環境,如果未設置,則返回 NULL

setGraphicsEventEnvsetGraphicsEventHandlers 返回圖形設備的先前事件環境。

例子

# This currently only works on the Windows, X11(type = "Xlib"), and
# X11(type = "cairo") screen devices...
## Not run: 
savepar <- par(ask = FALSE)
dragplot <- function(..., xlim = NULL, ylim = NULL, xaxs = "r", yaxs = "r") {
    plot(..., xlim = xlim, ylim = ylim, xaxs = xaxs, yaxs = yaxs)
    startx <- NULL
    starty <- NULL
    prevx <- NULL
    prevy <- NULL
    usr <- NULL

    devset <- function()
        if (dev.cur() != eventEnv$which) dev.set(eventEnv$which)

    dragmousedown <- function(buttons, x, y) {
        startx <<- x
        starty <<- y
        prevx <<- 0
        prevy <<- 0
        devset()
        usr <<- par("usr")
        eventEnv$onMouseMove <- dragmousemove
        NULL
    }

    dragmousemove <- function(buttons, x, y) {
        devset()
        deltax <- diff(grconvertX(c(startx, x), "ndc", "user"))
        deltay <- diff(grconvertY(c(starty, y), "ndc", "user"))
	if (abs(deltax-prevx) + abs(deltay-prevy) > 0) {
	    plot(..., xlim = usr[1:2]-deltax, xaxs = "i",
		      ylim = usr[3:4]-deltay, yaxs = "i")
	    prevx <<- deltax
	    prevy <<- deltay
	}
        NULL
    }

    mouseup <- function(buttons, x, y) {
    	eventEnv$onMouseMove <- NULL
    }	

    keydown <- function(key) {
        if (key == "q") return(invisible(1))
        eventEnv$onMouseMove <- NULL
        NULL
    }

    setGraphicsEventHandlers(prompt = "Click and drag, hit q to quit",
                     onMouseDown = dragmousedown,
                     onMouseUp = mouseup,
                     onKeybd = keydown)
    eventEnv <- getGraphicsEventEnv()
}

dragplot(rnorm(1000), rnorm(1000))
getGraphicsEvent()
par(savepar)

## End(Not run)

作者

Duncan Murdoch

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Wait for a mouse or keyboard event from a graphics window。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。