Вот исходный код 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)
}
Вы можете понять, почему он возвращает NULL, поскольку это явно указано в if (!interactive()) return(NULL)
. Попробуйте это вставить в свой оригинальный код:
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)
Кажется, что он теряет функциональность (т.е. я не мог манипулировать сюжетом на OSX с X11 в качестве графического устройства), но, по крайней мере, сюжет остается неизменным. Вызов внутреннего кода для этой функции недавно изменился (для подтверждения посмотрите исходный код для R в двух версиях - код для этой функции в R 2.6.2, например, находится в R-2.6.2 / src / library / grDevices /R/gevents.R).