62

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

4

6 回答 6

57

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

file_to_source.R

print(commandArgs())

main_script.R

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

输出[1] 1 2 3

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

于 2013-01-25T16:42:44.730 回答
26

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

arg1 <- 1
arg2 <- 2
system(paste("Rscript file_to_source.R", arg1, arg2))
于 2014-02-20T22:16:26.503 回答
9

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

> tmpfile <- tempfile()
> cat("print(a)", file=tmpfile)
> a <- 5
> source(tmpfile)
[1] 5
于 2013-01-25T16:38:10.740 回答
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)

文件调用 source()

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

c, d

于 2017-01-30T15:35:20.507 回答
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()

于 2020-02-25T16:22:46.263 回答
0

我在这里测试了一些替代方案,我最终得到了这个:

文件调用源:

source_with_args <- function(file, ...){
  system(paste("Rscript", file, ...))
}
source_with_args(
  script_file,
  paste0("--data=", data_processed_file),
  paste0("--output=", output_file)
)

文件来源:

  library(optparse)
  option_list = list(
    make_option(
      c("--data"),
      type="character",
      default=NULL,
      help="input file",
      metavar="filename"
    ),
    make_option(
      c("--output"),
      type="character",
      default=NULL,
      help="output file [default= %default]",
      metavar="filename"
    )
  )
  opt_parser = OptionParser(option_list=option_list)
  data_processed_file <- opt$data
  oputput_file <- opt$output
  if(is.null(data_processed_file) || is.null(oputput_file)){
    stop("Required information is missing")
  }
于 2022-02-09T13:36:23.920 回答