gpt4 book ai didi

r - 通过 CMD 或 Batch 将参数传递给 R 脚本

转载 作者:行者123 更新时间:2023-12-02 20:24:53 24 4
gpt4 key购买 nike

目前我有一个 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

最佳答案

您可以在 R 中使用以下包之一来解析命令行选项来完成所有这些操作:

  • docopt(我最喜欢的)
  • 优化解析
  • argparse
  • 获取选择

或者手动执行——不推荐。

您也不希望使用较旧的 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 实现了它。

关于r - 通过 CMD 或 Batch 将参数传递给 R 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50256138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com