我正在寻找一种方法来获得用户输入在循环内,而在批处理模式下执行。
readLines()
和scan()
仅在交互模式下对我来说工作得很好,在批处理模式下,它们开始作为用户输入读取代码行,除非所有代码都被{}
包围,这很不方便。我需要一个简单的解决方案来获取一个整数值我只需输入value然后按ENTER,所以
- 输入字段(如果解决方案涉及GUI)必须自动获得焦点和
- 输入必须触发输入/提交结束。
我找不到一种方法来做到这一点,将满足两个条件,例如ginput()
从gWidgets激活输入字段,但ENTER不触发表单提交。
我是这样解决我自己的问题的:
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)
更新:
我现在不能测试这个,但是看看?menu
,让它弹出一个gui窗口。
我不确定这是否会起作用,但它的不同之处在于它需要鼠标点击响应。
原始答:
根据?readline
的文档:
只能在交互式会话中使用。
. .
在非交互式使用中,结果就好像响应是RETURN,值是"。
如果您只是在等待一条信息,并且在开始执行脚本之前您不知道这条信息(假设,要做出的决定取决于脚本前面的结果),那么一种替代方法是简单地将脚本分成三个部分:
- 决策点之前的所有内容。
- 提示输入 的交互式脚本
- 决策点之后的所有内容。
并通过在交互式会话中调用第二个端点来简单地将三个端点连接在一起。然后通过打电话给第三个来达到第二个目的。