4

我正在寻找一种在批处理模式下执行时在循环内获取用户输入的方法。

readLines()并且scan()仅在交互模式下对我有用,在批处理模式下,它们开始读取代码行作为用户输入,除非所有代码都被 包围{},这很不方便。我需要一个简单的解决方案来获取 1 个整数值,我可以输入值并按 ENTER,所以

  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 并且值为“”。

如果您只是在等待一条信息,并且在开始执行脚本之前您不知道这条信息(可能需要根据脚本前面的结果做出决定),那么一种替代方法是将您的脚本简单地分成三个部分:

  • 决策点之前的一切。
  • 提示输入的交互式脚本
  • 决定点之后的一切。

并且通过在交互式会话中调用第二个结束来简单地将这三个链接在一起。然后通过调用第三个结束第二个。

于 2013-05-14T08:12:33.090 回答