2014-11-24 227 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