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 のソース コードは次のとおりです。

関数 (prompt = "入力待ち"、onMouseDown = NULL、onMouseMove = NULL、
    onMouseUp = NULL、onKeybd = NULL、consolePrompt = プロンプト)
{

    if (!インタラクティブ())
        リターン(NULL)
    if (!missing(プロンプト) || !missing(onMouseDown) || !missing(onMouseMove) ||
        ! 行方不明 (onMouseUp) || !missing(onKeybd)) {
        setGraphicsEventHandlers(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())
  # リターン(NULL)
    if (!missing(プロンプト) || !missing(onMouseDown) || !missing(onMouseMove) ||
        ! 行方不明 (onMouseUp) || !missing(onKeybd)) {
        setGraphicsEventHandlers(prompt = プロンプト、onMouseDown = onMouseDown、
            onMouseMove = onMouseMove、onMouseUp = onMouseUp、
            onKeybd = onKeybd)
    }
    .External2(C_getGraphicsEvent, consolePrompt)
}
環境 (getGraphicsEvent2) = 環境 (grDevices::getGraphicsEvent)

dragplot(rnorm(1000), rnorm(1000))


kbd = 関数 (キー) {
 if (key == "q") { "終了" } else NULL }
 getGraphicsEvent2("入力待ち", onKeybd = kbd)

機能が失われているように見えます (つまり、グラフィック デバイスとして X11 を使用している OSX でプロットを操作できませんでした) が、少なくともプロットは維持されます。この関数の内部コードへの呼び出しが最近変更されました (確認するには、2 つのバージョンの R のソース コードを参照してください。たとえば、R 2.6.2 のこの関数のコードは R-2.6.2/src/library/grDevices にあります。 /R/gevents.R)。

于 2013-12-19T20:56:59.117 に答える