Phi*_*ack 12 windows r keyboard-events rterm
无论如何,在旧版本的R版本2.9中,我能够使用rterm.exe从批处理运行R程序并创建一个图形窗口,用户可以来回滚动查看图形.我能够通过使用一些R代码来做到这一点:
kbd <- function(key) {
if (key == "q") { "Quit" } else NULL }
getGraphicsEvent(" ", onKeybd = kbd)
Run Code Online (Sandbox Code Playgroud)
这使得图形查看器保持打开状态,直到用户按下"q"键.在较新版本的R中,似乎由于这是从批处理开始的(使用Rterm.exe进行非交互),键值始终为NULL,图形窗口只是闪烁和关闭.我的问题是,如果有任何方法我可以以某种方式说服R系统我正在运行一个准交互式会话并让getGraphicsEvent的行为不立即返回NULL?
以下是 getGraphicsEvent 的源代码:
函数(提示=“等待输入”,onMouseDown = NULL,onMouseMove = NULL,
onMouseUp = NULL、onKeybd = NULL、consolePrompt = 提示)
{
如果(!交互式())
返回(空)
if (!missing(提示) || !missing(onMouseDown) || !missing(onMouseMove) ||
!missing(onMouseUp) || !失踪(onKeybd)){
setGraphicsEventHandlers(提示 = 提示, 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 = 提示)
{
# 如果 (!interactive())
# 返回(空)
if (!missing(提示) || !missing(onMouseDown) || !missing(onMouseMove) ||
!missing(onMouseUp) || !失踪(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") { "退出" } else NULL }
getGraphicsEvent2("等待输入", onKeybd = kbd)
它似乎失去了功能(即我无法在使用 X11 作为图形设备的 OSX 上操作绘图),但至少绘图保持不变。该函数的内部代码调用最近发生了变化(要确认,请查看两个版本中的 R 源代码 - 例如,R 2.6.2 中该函数的代码位于 R-2.6.2/src/library/grDevices /R/gevents.R)。
| 归档时间: |
|
| 查看次数: |
418 次 |
| 最近记录: |