12

无论如何,在旧版本的 R 版本 2.9 中,我能够使用 rterm.exe 从批处理运行 R 程序并创建一个用户可以来回滚动并查看图形的图形窗口。我可以通过使用一些 R 代码来做到这一点,例如:

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

这使图形查看器保持打开状态,直到用户按下“q”键。在较新版本的 R 中,似乎因为这是从批处理启动的(使用 Rterm.exe 非交互式),所以键值始终为 NULL,图形窗口只是闪烁并关闭。我的问题是,是否有任何方法可以让 R 系统相信我正在运行一个准交互式会话并让 getGraphicsEvent 的行为不立即返回 NULL?

4

2 回答 2

1

您可以通过使用选项启动 Rterm 来伪造一个交互式会话,该会话将被检测为非交互式会话

--ess

在 Windows 上,或

--interactive

在类 Unix 上。

这可能会导致其他问题,因为所有函数都将会话视为交互式。您不能在会话中间更改该标志,因为它会影响许多与 I/O 相关的事情。

于 2015-01-13T14:17:39.813 回答
0

以下是 getGraphicsEvent 的源代码:

功能(提示=“等待输入”,onMouseDown = NULL,onMouseMove = NULL,
    onMouseUp = NULL,onKeybd = NULL,consolePrompt = 提示)
{

    如果(!交互式())
        返回(空)
    如果 (!missing(prompt) || !missing(onMouseDown) || !missing(onMouseMove) ||
        !missing(onMouseUp) || !missing(onKeybd)) {
        setGraphicsEventHandlers(提示 = 提示,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 = 提示)
{

  # if (!interactive())
  # 返回(空)
    如果 (!missing(prompt) || !missing(onMouseDown) || !missing(onMouseMove) ||
        !missing(onMouseUp) || !missing(onKeybd)) {
        setGraphicsEventHandlers(提示 = 提示,onMouseDown = onMouseDown,
            onMouseMove = onMouseMove,onMouseUp = onMouseUp,
            onKeybd = onKeybd)
    }
    .External2(C_getGraphicsEvent, consolePrompt)
}
环境(getGraphicsEvent2)= 环境(grDevices::getGraphicsEvent)

拖动图(rnorm(1000),rnorm(1000))


kbd = 功能(键){
 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)。

于 2013-12-19T20:56:59.117 回答