在老版本的R版本2.9中,我能够使用rterm.exe从批处理运行R程序,并创build一个graphics窗口,用户可以来回滚动并查看graphics。 我能够通过使用一些R代码来做到这一点:
kbd <- function(key) { if (key == "q") { "Quit" } else NULL } getGraphicsEvent(" ", onKeybd = kbd)
这使graphics查看器保持打开状态,直到用户按下“q”键。 在更新版本的R中,似乎是因为这是从批处理(使用Rterm.exe进行非交互)开始的,所以键值始终为NULL,graphics窗口只是闪烁和closures。 我的问题是,如果有什么办法我可以说服R系统,我正在运行一个准交互式会话,getGraphicsEvent行为立即不返回NULL?
您可以将一个交互式会话伪装成非交互式会话,方法是使用该选项启动Rterm
--ess
在Windows上,或者
--interactive
在Unix相同。
这可能会导致其他问题,因为所有功能都将会话视为交互式。 您不能在会话中更改该标志,因为它会影响许多与I / O相关的事情。
这里是getGraphicsEvent的源代码:
函数(prompt =“等待输入”,onMouseDown = NULL,onMouseMove = NULL, onMouseUp = NULL,onKeybd = NULL,consolePrompt =提示符) { if(!interactive()) 返回(NULL) 如果(!missing(提示)||!missing(onMouseDown)||!missing(onMouseMove)|| !缺少(onMouseUp)|| !失踪(onKeybd)){ setGraphicsEventHandlers(prompt = prompt,onMouseDown = onMouseDown, onMouseMove = onMouseMove,onMouseUp = onMouseUp, onKeybd = onKeybd) } .External2(C_getGraphicsEvent,consolePrompt) }
你可以看到它为什么返回NULL,因为这是用if (!interactive()) return(NULL)
。 试试这个插入你的原始代码:
getGraphicsEvent2 = function(prompt =“等待输入”,onMouseDown = NULL,onMouseMove = NULL, onMouseUp = NULL,onKeybd = NULL,consolePrompt =提示符) { #if(!interactive()) #return(NULL) 如果(!missing(提示)||!missing(onMouseDown)||!missing(onMouseMove)|| !缺少(onMouseUp)|| !失踪(onKeybd)){ setGraphicsEventHandlers(prompt = prompt,onMouseDown = onMouseDown, onMouseMove = onMouseMove,onMouseUp = onMouseUp, onKeybd = onKeybd) } .External2(C_getGraphicsEvent,consolePrompt) } 环境(getGraphicsEvent2)=环境(grDevices :: getGraphicsEvent) dragplot(rnorm(1000),rnorm(1000)) kbd = function(key){ if(key ==“q”){“Quit”} else NULL} getGraphicsEvent2(“等待输入”,onKeybd = kbd)
它似乎失去了功能(即我不能操纵与X11作为图形设备OSX的情节),但至少情节保持。 对于这个函数的内部代码的调用最近发生了变化(为了确认,查看R的源代码有两个版本 – R 2.6.2中这个函数的代码,例如在R-2.6.2 / src / library / grDevices /R/gevents.R)。