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

时间:2013-01-25 16:05:24

标签: r

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

5 个答案:

答案 0 :(得分:37)

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

file_to_source.R

print(commandArgs())

main_script.R

commandArgs <- function(...) 1:3
source('file_to_source.R')

输出[1] 1 2 3

如果你的主脚本本身不带任何命令行参数,你也可以只为这个脚本提供参数。

答案 1 :(得分:23)

最简单的解决方案是将source()替换为system()paste。试试

arg1 <- 1
arg2 <- 2
system(paste("Rscript file_to_source.R", arg1, arg2))

答案 2 :(得分:3)

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

> tmpfile <- tempfile()
> cat("print(a)", file=tmpfile)
> a <- 5
> source(tmpfile)
[1] 5

答案 3 :(得分:2)

@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()
 }

文件调用来源()

args$arg1 = "c" 
args$arg2 = "d"
source ("file_to_be_sourced.R")
print (args)

c,d

答案 4 :(得分:0)

这有效:

# source another script with arguments
source_with_args <- function(file, ...){
  commandArgs <<- function(trailingOnly){
    list(...)
  }
  source(file)
}

source_with_args("sourcefile.R", "first_argument", "second_argument")

请注意,必须使用commandArgs而不是<<-重新定义内置的<-函数。 据我了解,这使它的范围扩展到了定义它的功能source_with_args()之外。