在批处理模式下执行R代码时的用户输入

时间:2013-05-14 07:49:26

标签: r user-interface user-input stdin gwidgets

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

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

  1. 输入字段(如果解决方案涉及GUI)必须自动获得焦点和
  2. ENTER必须触发输入/提交结束。
  3. 我无法找到满足这两个条件的方法,例如:来自gWidgets的ginput()激活输入字段,但ENTER不会触发表单提交。

2 个答案:

答案 0 :(得分:1)

更新

我现在无法测试,但请查看?menu并弹出一个gui窗口。
我不确定这是否可行,但它的不同之处在于需要鼠标点击响应。


原始答案:

根据?readline的文档:

  

这只能用于交互式会话   ..
  在非交互式使用中,结果就像响应是RETURN并且值是“”。

如果您只是在等待一条信息,并且在开始执行脚本之前您不知道这条信息(可能会做出决定,这取决于脚本中较早的结果),然后一种方法是简单地将你的脚本分成三部分:

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

通过在交互式会话中调用第二个端点,将第三个链接在一起。然后通过调用第三个结束第二个结束。

答案 1 :(得分:1)

以下是我解决自己问题的方法:

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)