使readline等待R中的输入

Hac*_*k-R 12 r

我正在尝试让我的代码在继续之前向我询问"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)

  • 不知道你的意思,至少在 python 和 ruby​​ 中,你不需要分开这两种方式。 (2认同)

小智 13

您是否通过突出显示行并单击运行来运行代码?如果是这样,那可能是你的问题,因为R是逐行输入终端中的代码.

而是编写脚本(或注释掉您未测试的部分)并单击源按钮.然后R等待用户响应,而不是将readline()之后的行输入readline().

我和你有同样的问题,这促使我寻找答案.但后来我尝试了这种执行代码的不同方法,并且它有效.


Lar*_*dua 9

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()