2011-03-31 98 views
3

我有一個腳本,我想用鍵盤輸入啓動它,然後繼續基於在此變量中輸入的值的工作,我試過y=readline("please enter a value")但腳本不會等待輸入一個值,它只是顯示這個句子並繼續,如何做到這一點? 在此先感謝?停止腳本,直到從鍵盤輸入值R

+0

你是如何運行你的腳本? 'readline()'只能交互使用。一個可重複的例子會有所幫助。 – 2011-03-31 23:44:52

+0

@Gavin Simpson:我在windows上運行腳本,點擊它(它以cmd運行),thnx – weblover 2011-04-01 21:48:27

回答

2

你可能想scan(),是這樣的:

print("please enter a value") 
y <- scan(file = "", what = "", nmax = 1) 

scan()將等待用戶輸入任何文字將被存儲在y - 模式字符在這種情況下,一個載體。

+0

@mdsumner:你好,它不工作,它和readline一樣,它打印句子然後它寫(讀0行)和腳本繼續,順便說一句我在Windows上運行腳本,與2點擊它(它運行在一個命令),thnx – weblover 2011-04-01 21:47:11

+0

像以前一樣,和加文辛普森提供您的原始問題,你正在做什麼的完整描述,你正在用來做什麼,你期望經歷什麼,以及你實際經歷什麼都會有幫助。這是交互式使用的R代碼,如輸入到R控制檯中一樣。如果代碼是來自文件的source()d,它也可以工作。 – mdsumner 2011-04-01 23:58:22

+0

@abd正如我所說 - 'readline()'只在交互式會話中可用。您正在非交互式shell會話中運行此操作。因此它**不會**工作。我在我之前的評論中曾這樣說過! – 2011-04-02 00:29:05

6

這是一個非常簡單的#!腳本,它創建一個函數foo(),其唯一目的是回顯它的參數'bar'

#! /home/gavin/R/2.13-patched/build/bin/Rscript --vanilla 
foo <- function(bar) { 
    writeLines(paste("You supplied the following information:", bar)) 
} 

## grab command arguments passed as -args 
args <- commandArgs(TRUE) 

## run foo 
foo(args) 

我們搶過去了,從使用功能commandArgs()外殼腳本的命令行參數,然後把它們傳遞給foo()與腳本的最後一行。

如果我們在文件foobar.R中有那麼一點代碼,那麼我們可以傳入參數並使用Rscript接口運行腳本。您還需要使上述可執行文件(chmod it)。

然後腳本可以被稱爲像工作原理如下:

[[email protected] ~]$ ./foobar.R Cl 
You supplied the following information: Cl 

但是做作爲不幸的是注意在​​3210的信息,標準的Windows CMD彈不知道#!像腳本,所以你可能需要安裝一些其他的shell(幫助建議一個Cygwin shell應該工作)來使用我展示的功能。

更新:使用source()readline()

另一種方法是,如果你不需要非交互式地運行(即你不打開R GUI並運行一行代碼),那麼只需要source()腳本。例如,如果這是一個腳本調用barfoo.R

dynamicwilcox <- function() { 
    ANSWER <- readline("What column do you want to work on? ") 
    if(ANSWER=="Ph") { 
     writeLines("column was 'Ph'") 
    } else if(ANSWER=="Cl") { 
     writeLines("column was 'Cl'") 
    } else { 
     writeLines(paste("Sorry, we don't know what to do with column", ANSWER)) 
    } 
    ANSWER ## return something 
} 

dynamicwilcox() 
從R桂提示

然後,我們可以這樣做:

R> source("barfoo.R") 
What column do you want to work on? Cl 
column was 'Cl' 

,或者如果你不想指定完整路徑做這樣的:

R> source(file.choose()) 

readline()在交互式R對話時工作得很好,確實是這個職位的最佳工具 - 這正是它被屈尊做。

整個前提條件是您希望以批處理模式運行腳本,但提供一些輸入沒有多大意義。 R期望腳本在批處理模式下運行時是自包含的。您可能沒有意識到,但是當您雙擊腳本時,它將以批處理模式運行。

+0

@adb你有沒有在Windows上工作? – 2011-04-02 12:47:28

+0

是的,非常感謝,它的作品:) – weblover 2011-04-03 12:22:14

0

我在Ubuntu(不是Windows)上遇到了同樣的問題並找到了解決方案。

而不是Rscript使用littler(/usr/bin/r)並確保將互動標誌-i傳遞給小生。這種組合設法說服readline()根據需要在腳本的工作:

#!/usr/bin/r -vi 

eprintf <- function(...) cat(sprintf(...), sep='', file=stderr()) 

prompt.read <- function(prompt="\n[hit enter to continue]: ") { 
    eprintf("%s", prompt) 
    invisible(readline()) 
} 

ans <- prompt.read('Please enter a value: ') 
eprintf("You have entered: '%s'\n", ans) 

# rest of script comes here... 

當我運行一個腳本,我得到:

$ ./rl.r 
Please enter a value: 42 
You have entered: '42' 

$ ./rl.r 
Please enter a value: Hello to you! 
You have entered: 'Hello to you!' 

安裝利特勒(在Ubuntu):

sudo apt-get install littler