通过CMD或批处理将参数传递给R脚本

时间:2018-05-09 14:42:48

标签: r batch-file parameters

目前我有一个R脚本,它将8个参数硬编码为我脚本的前8行。

我已经制作了一个批处理文件,试图动态地手动更改参数,但它似乎没有按照我想要的方式工作。

当前运行脚本的批处理但实际上并未更改参数

echo off
ECHO PRESS ENTER AT ANY INPUT TO ACCEPT the DEFAULT VALUE.

:: Setting of Variables
@Set /P RScript=Set path to R:_
@Set /P RProgram=Set path to RScript:_   
@Set /P RStartDir=Set Start Directory:_   
@Set /P Begin=Begin on which Loan?:_       
@Set /P End=End on which Loan?:_         
@Set /P OutputDir=Set Output Directory:_   
@Set /P Deal=Set Deal input file (.txt):_         
@Set /P OutputFile=Name Deal Output File:_
@Set /P AsOfDate=As of Date?:_  
@Set /P ThirtyYrSpread=Thirty Year Mortgage Spread?:_

:: If Blank (enter), set variables/paths to Defaults (Listed Below)

if "%RScript%"==""              Set RScript=c:\program files\r\r- 
3.4.3\bin\x64\rscript.exe
if "%RProgram%"==""             Set RProgram=C:\MortgageMatt\Cirt2014- 
1\0.Mortgage Model.R
if "%RStartDir%"==""            Set RStartDir=C:\MortgageMatt\Cirt2014-1
if "%Begin%"==""                Set Begin=1
if "%End%"==""                  Set End=2
if "%OutputDir%"==""            Set OutputDir=C:\MortgageMatt\Cirt2014-1
if "%Deal%"==""                 Set Deal=Cirt 2014-1 Loan Level.txt
if "%OutputFile%"==""           Set OutputFile=Cirt 2014-1d
if "%AsOfDate%"==""             Set AsOfDate=62017
if "%ThirtyYrSpread%" == ""     Set ThirtyYrSpread=135

echo "%RScript% %RProgram% %RStartDir% %Begin% %End% %OutputDir% %Deal% 
%OutputFile% %AsOfDate% %ThirtyYrSpread%"

ECHO PLEASE CHECK IF THESE VALUES ARE CORRECT
pause

:: Command Prompt, /c Carries out command specified by string and then 
terminates
cmd /c ""%RScript%" "%RProgram%" "%RStartDir%" "%Begin%" "%End%" 
"%OutputDir%" "%Deal%" "%OutputFile%" "%AsOfDate%" "%ThirtyYrSpread%""

因为参数实际上是硬编码到R脚本中的,所以这是我为了适应而添加的内容。这看起来不错吗?我认为这是我遇到错误的地方。

添加到R脚本

args <- commandArgs(trailingOnly = TRUE)
if (length(args) == 0) {
   if (!exists("dataDir")) { stop("variables dataDir not found") }
   # Set dataDir variable when Running inside a R Session
   args <- c(getwd(), 1, 2, ".", "Cirt 2014-1 Loan Level.txt", "Cirt 2014- 
    1", "62017", 175)
}
print(args)

# Input Values

Input.Directory <- paste(args[1]) ## getwd() , "/", "inputs", sep = "")
Begin.Sim <- args[2]
End.Sim <- args[3]
Output.Directory <- paste(args[1],"\\",args[4],sep = "") ##, "/", "outputs", 
sep = "")
Pool.ID.File <- args[5] #"Cirt 2014-1 Loan Level.txt"
Pool.ID <- args[6] #"Cirt 2014-1"
asofdate <- args[7] #"62017"
Thirty.Yr.Mort.Spread <- args[8] # 175

当我尝试使用.bat在cmd中运行它时,我收到一条错误消息,指出无法更改工作目录。有人有什么建议吗?

我很清楚错误在哪里,但我正努力解决它。 包含其中所有内容的文件路径为

C:\MortgageMatt\Cirt2014-1

编辑:

我也听说过一种名为R CMD Batch的东西......我应该调查一下吗?我发现它是一种较老的技术。

我的代码在Args / IF之前的样子

# Input Values
Input.Directory  <- "C:/Mortgage/Cirt 2014 - 1"
Output.Directory <- "C:/Mortgage/Cirt 2014 - 1"
Pool.ID.File     <- "Cirt 2014-1 Loan Level.txt"
Pool.ID <- "Cirt 2014-1 NEW"
start<- 1 
sims <- 2  # Number of Simulations
asofdate <- "62017"
Thirty.Yr.Mort.Spread <- 175

1 个答案:

答案 0 :(得分:3)

您可以使用其中一个软件包解析命令行选项来完成R中的所有操作:

  • docopt(我最喜欢的)
  • optparse
  • argparse
  • getopt的

或手动完成 - 不推荐。

您也不希望较旧的R CMD BATCH - 使用Rscript(或更小的,但更小的在Windows上不起作用)。

代码示例

#!/usr/bin/Rscript

suppressMessages(library(docopt))

doc <- "Usage: foo.R [-h] [-x] [--src REPODIR] [--out OUTDIR] [FILES...]

-s --src REPODIR      source root directory [default: ~/git]
-o --out OUTDIR       output directory [default: /tmp]
-h --help             show this help text"

opt <- docopt(doc)          # docopt parsing

print(opt)

与-h

一起使用

你收到一条好消息,自动,没有格式化需求:

edd@rob:/tmp$ Rscript so50256138.R -h
Usage: foo.R [-h] [-x] [--src REPODIR] [--out OUTDIR] [FILES...]

-s --src REPODIR      source root directory [default: ~/git]
-o --out OUTDIR       output directory [default: /tmp]
-h --help             show this help text 
edd@rob:/tmp$ 

与参数

一起使用

注意如何使用一个默认参数,另一个来自命令行:

edd@rob:/tmp$ Rscript so50256138.R -s A 
List of 9
 $ --src : chr "A"
 $ --out : chr "/tmp"
 $ --help: logi FALSE
 $ -x    : logi FALSE
 $ FILES : list()
 $ src   : chr "A"
 $ out   : chr "/tmp"
 $ help  : logi FALSE
 $ x     : logi FALSE
NULL

您可以通过名称或选项标记opt访问它们。

docopt网站有更多;这实际上是一个可移植的规范,CRAN包为R实现它。