getGraphicsEvent阅读非交互式会话的关键板

在老版本的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)。