4

バッチ モードで実行中にループ内でユーザー入力を取得する方法を探しています。

readLines()インタラクティブモードでscan()のみうまく機能し、バッチモードでは、すべてのコードが で囲まれていない限り、ユーザー入力としてコード行を読み始めます{}。これは不便です。値を入力してENTERを押すだけで整数値を1つだけ取得する簡単なソリューションが必要なので、

  1. 入力フィールド (ソリューションに GUI が含まれる場合) は自動的にフォーカスを取得し、
  2. ENTER は、入力/送信の終了をトリガーする必要があります。

ginput()gWidgets から入力フィールドをアクティブにするなど、両方の条件を満たす方法が見つかりませんが、ENTER はフォーム送信をトリガーしません。

4

2 に答える 2

2

これが私が自分の問題を解決した方法です:

require(gWidgets)
options(guiToolkit="RGtk2")

INPUT <- function(message) {
  CHOICE <- NA
  w <- gbasicdialog(title=message, handler = function(h,...) CHOICE <<- svalue(input))
  input <- gedit("", initial.msg="", cont=w, width=10)
  addHandlerChanged(input, handler=function (h, ...) {
    CHOICE <<- svalue(input)
    dispose(w)
  })
  visible(w, set=TRUE)
  return(CHOICE)
}

repeat{
  x=INPUT("Input an integer")
  if(!is.na(as.integer(x))) break
}
print(x)
于 2013-05-14T09:42:45.103 に答える
1

アップデート:

今はこれをテストすることはできませんが、見てみ?menuて、GUI ウィンドウをポップアップさせてください。
それが機能するかどうかはわかりませんが、マウスクリックの応答が必要な点が異なります。


元の答え:

へのドキュメントに従って?readline

これは、インタラクティブ セッションでのみ使用できます。
..
非対話的な使用では、結果は、応答が RETURN で、値が "" であるかのようになります。

1 つの情報を待っているだけで、スクリプトの実行を開始する前にこの情報を知らなかった場合 (おそらく、スクリプトの前半の結果に応じて決定を下す必要があります)、別の方法として、スクリプトを単純に 3 つの部分に分割する方法があります。

  • 決定点の前のすべて。
  • 入力を促す対話型スクリプト
  • ディシジョン ポイント以降のすべて。

そして、対話型セッションで 2 番目を呼び出すことによって最初の終了を取得することで、3 つをチェーンするだけです。次に、3 番目を呼び出して 2 番目を終了します。

于 2013-05-14T08:12:33.090 に答える