2011-03-31 110 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