我正在尝试让我的代码在继续之前向我询问"TRUE"或"FALSE"值.
如果我一次运行一行,它目前工作正常,但是当我在RStudio中一次运行所有代码时,它只是继续而不等待用户输入并为我的参数记录值"".
raw <- readline("TRUE or FALSE -- this is a validation run: ")
if (raw == "F" | raw == "FALSE" | raw == "False"){
validation <- F
} else{
validation <- T
}
rm(raw)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想的作品,无论我如何运行一个答案- RScript
,source
内RStudio,或运行它(即选择代码并按run
或Ctrl输入).
42-*_*42- 20
如果你想在交互模式下这样做,那么你已经有了答案但不能用于Rscript.对于该实例,您需要使用以下命令向控制台发送消息cat
:
如果此测试文件名为"prompt.r"并且位于您在系统控制台会话中工作的目录中:
cat("a string please: ");
a <- readLines("stdin",n=1);
cat("You entered")
str(a);
cat( "\n" )
Run Code Online (Sandbox Code Playgroud)
然后你可以从命令行运行它
$ Rscript prompt.r
Run Code Online (Sandbox Code Playgroud)
如果你想要一个通用的脚本,那么这将在交互条件下运行你的脚本,而我的脚本用于非交互式脚本:
if (interactive() ){raw <-
readline("TRUE or FALSE -- this is a validation run: ")
if (raw == "F" | raw == "FALSE" | raw == "False"){
validation <- F
} else{
validation <- T
}
rm(raw) } else{
# non-interactive
cat("a string please: ");
a <- readLines("stdin",n=1);
cat("You entered")
str(a);
cat( "\n" )}
Run Code Online (Sandbox Code Playgroud)
小智 13
您是否通过突出显示行并单击运行来运行代码?如果是这样,那可能是你的问题,因为R是逐行输入终端中的代码.
而是编写脚本(或注释掉您未测试的部分)并单击源按钮.然后R等待用户响应,而不是将readline()之后的行输入readline().
我和你有同样的问题,这促使我寻找答案.但后来我尝试了这种执行代码的不同方法,并且它有效.
readline
根据手册,“不等待输入”的原因是( ?readline
):
在非交互式使用中,结果就像响应是 RETURN 并且值为“”。
您偶然发现了 R 的一项“令人惊讶”的功能。
<rant>
为什么readline()
仅在“交互模式”下工作对我来说完全是个谜,因为从脚本中请求用户输入是完全可以接受的用例。例如,Python 为您提供了input(prompt)
可以在需要时调用的函数。
</rant>
解决这个混乱的一个相对方便的方法是定义一个函数(“每个编程问题都可以通过另一个间接级别来解决”......):
user.input <- function(prompt) {
if (interactive()) {
return(readline(prompt))
} else {
cat(prompt)
return(readLines("stdin", n=1))
}
}
Run Code Online (Sandbox Code Playgroud)
一个积极的副作用是您可以在user.input()
. 但我怀疑这就是 的奇怪行为背后的意图readline()
。
归档时间: |
|
查看次数: |
14511 次 |
最近记录: |