停止脚本,直到从R中的键盘输入一个值

web*_*ver 3 r

我有一个脚本,我想用键盘输入启动它,然后根据在此变量中输入的值继续工作,我试过y=readline("please enter a value")但脚本不会等待输入值,它只显示这句话并继续,这怎么办?提前致谢 ??

Rei*_*son 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)
Run Code Online (Sandbox Code Playgroud)

我们使用该commandArgs()函数获取从shell传递给脚本的任何命令行参数,然后将它们传递给foo()脚本的最后一行.

如果我们在文件中有那么一点代码foobar.R,那么我们可以传入一个参数并使用该Rscript接口运行脚本.您还需要制作上述可执行文件(chmodit).

然后可以调用脚本,并按如下方式工作:

[gavin@desktop ~]$ ./foobar.R Cl
You supplied the following information: Cl
Run Code Online (Sandbox Code Playgroud)

但请注意信息,?Rscript遗憾的是,标准的Windows cmd shell不知道#!类似的脚本,因此您可能需要安装其他一些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()
Run Code Online (Sandbox Code Playgroud)

然后从R Gui提示,我们可以做到:

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

或者如果您不想指定完整路径,请执行以下操作:

R> source(file.choose())
Run Code Online (Sandbox Code Playgroud)

readline() 在交互式R会话中使用时工作得很好,并且确实是工作的最佳工具 - 这正是它的设计目标.

您希望以批处理模式运行脚本但提供一些输入的整个前提没有多大意义.R期望在批处理模式下运行时脚本是自包含的.您可能没有意识到这一点,但是当您双击脚本时,它将以批处理模式运行.