2014-11-24 193 views
5

我试图让我的代码在继续之前向我询问“TRUE”或“FALSE”的值。使readline等待输入R

如果我一次只运行一行,它目前工作正常,但是当我在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) 

理想情况下,我想的作品,无论我如何运行一个答案 - RScriptsource内RStudio,或运行它(即选择代码并按run或Ctrl输入)。

+0

你是怎么“一次运行的代码”。粘贴到终端?使用Rscript.exe? – 2014-11-24 19:18:07

+0

@matthewPlourde in RStudio。运行/采购整个文件或包含此文件的一部分。 – 2014-11-24 19:22:21

+0

你可以通过if检查f/F/false/False/FALSE/fasle/etc的所有可能性if(toupper(unlist(strsplit(raw,''))[1])=='F')' – rawr 2014-11-24 19:27:28

回答

11

如果你想在交互模式下做到这一点,那么你已经有答案,但不适用于Rscript。对于该实例,你需要将消息发送到控制台cat

如果这个测试文件被命名为“prompt.r”,是在你在系统控制台会话的工作目录:

cat("a string please: "); 
a <- readLines("stdin",n=1); 
cat("You entered") 
str(a); 
cat("\n") 

然后,你可以为

$ Rscript prompt.r 

在命令行中运行它,如果你想要一个通用的脚本那么这将交互式运行条件下你的脚本和我的脚本非交互的:

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")} 
+0

有没有更好的方式来组合交互模式和脚本模式? – jtianling 2017-11-01 09:32:25

+0

对“更好”解决方案的请求的回答需要某种目前尚未表达的软件度量标准。 – 2017-11-01 19:03:41

+0

不知道你的意思,至少,在Python和红宝石中,你不需要分开这两种方式。 – jtianling 2017-11-02 02:16:38

8

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

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

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

+0

这实际上解决了我的问题,只要原始代码来源,readLines()似乎停止并等待用户输入。 – 2017-02-23 03:10:52