Передача параметров в R-скрипт через CMD или пакет - PullRequest
0 голосов
/ 09 мая 2018

В настоящее время у меня есть скрипт 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 Script, я добавил это, чтобы попытаться приспособиться. Это выглядит хорошо? Я думаю, что здесь я сталкиваюсь с ошибками.

Добавлено в скрипт 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

Когда я пытаюсь запустить его в cmd, используя .bat .. Я получаю сообщение об ошибке, которое говорит, что не может изменить рабочий каталог. У кого-нибудь есть предложения?

Я вроде понимаю, где ошибка, но я изо всех сил пытаюсь ее исправить. Путь к моему файлу со всем в нем

C:\MortgageMatt\Cirt2014-1

Edit:

Я также слышал о чем-то, называемом 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 голосов
/ 09 мая 2018

Вы можете сделать все это в R, используя один из этих пакетов для разбора параметров командной строки:

  • Докопт (мой любимый)
  • optparse
  • argparse
  • Getopt

или делать это вручную - не рекомендуется.

Вы также не хотите использовать более старую версию R CMD BATCH - используйте Rscript (или littler, но littler не работает в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...