如何在source()和R文件时传递命令行参数

Leo*_*188 44 r

在一个R文件中,我计划获取另一个支持读取两个命令行参数的R文件.这听起来像是一个琐事任务,但我无法在网上找到解决方案.任何帮助表示赞赏.

Mat*_*rde 40

我假设sourced脚本访问命令行参数commandArgs?如果是这样,您可以commandArgs在父脚本中覆盖,以便在您要采购的脚本中调用它时所需的内容.要了解这将如何工作:

file_to_source.R

print(commandArgs())
Run Code Online (Sandbox Code Playgroud)

main_script.R

commandArgs <- function(...) 1:3
source('file_to_source.R')
Run Code Online (Sandbox Code Playgroud)

输出 [1] 1 2 3

如果您的主脚本本身不接受任何命令行参数,您也可以只为此脚本提供参数.

  • 这种方法效果很好,但是当从文件到源的`commandArgs`调用使用`trailingOnly`参数时,它会失败.为了解决这个问题,我发现这通常更有用:`commandArgs < - function(...)1:3`其中`...`吸收任何未使用的参数. (2认同)

can*_*ine 23

最简单的解决方案是source()system()和替换paste.尝试

arg1 <- 1
arg2 <- 2
system(paste("Rscript file_to_source.R", arg1, arg2))
Run Code Online (Sandbox Code Playgroud)

  • 没错,这很简单,但是不会将`file_to_source.R`产生的对象带入`globalenv()`。为此,在我看来,您需要Matthew Plourde的技巧-重新定义`commandArgs`,也许在调用`source()`之后立即重新定义您的版本rm()。 (2认同)

GSe*_*See 8

如果您有一个脚本源自另一个脚本,您可以在第一个脚本中定义可由源脚本使用的变量。

> tmpfile <- tempfile()
> cat("print(a)", file=tmpfile)
> a <- 5
> source(tmpfile)
[1] 5
Run Code Online (Sandbox Code Playgroud)


dal*_*ogm 5

@Matthew Plourde 答案的扩展版本。我通常做的是使用 if 语句来检查命令行参数是否已定义,否则读取它们。

此外,我尝试使用 argparse 库来读取命令行参数,因为它提供了更整洁的语法和更好的文档。

要获取的文件

 if (!exists("args")) {
         suppressPackageStartupMessages(library("argparse"))
         parser <- ArgumentParser()
         parser$add_argument("-a", "--arg1", type="character", defalt="a",
               help="First parameter [default %(defult)s]")
         parser$add_argument("-b", "--arg2", type="character", defalt="b",
               help="Second parameter [default %(defult)s]")
         args <- parser$parse_args()
 }

 print (args)
Run Code Online (Sandbox Code Playgroud)

文件调用源()

args$arg1 = "c" 
args$arg2 = "d"
source ("file_to_be_sourced.R")
Run Code Online (Sandbox Code Playgroud)

c, d