【问题标题】:Is it possible to specify command line parameters to R-script in RStudio?是否可以在 RStudio 中为 R-script 指定命令行参数?
【发布时间】:2013-02-05 11:34:10
【问题描述】:

我想使用 RStudio 来编辑具有命令行参数的 R 脚本,例如,

my_rscript --dataset mydataset

然后将选项值读入 R 变量,例如 dataset,例如,使用 optparse 库。

但是,我找不到可以在 RStudio 中提供命令行的位置,以便我可以使用“保存时保存源”功能。相反,我必须在程序本身中硬编码所有程序参数:

dataset <- "mydataset"

每次我需要指定不同的数据时都需要修改脚本文本。

有人知道如何提供命令行信息吗?

【问题讨论】:

  • 您的问题似乎与 RStudio 没有特别相关,但更普遍地与 R 相关,所以我重新标记了它。如果这不是您的意思,那么您应该编辑您的问题。

标签: r rstudio


【解决方案1】:

现在我这样做: 打开一个编辑新 Rscript 的新窗口。如果我想保留它,我可以保存并命名为:test_myscript.R 这是test_myscript.R的内容:

debug(getopt) # suppose I want to debug 'getopt' function in 'myscript.R'
system("myscript.R -a -b -c")
# Debug process start after this. 
# Check ?browser for help about navigating inside browser

【讨论】:

  • system 不会为您提供“myscript.R”的结果
  • OP 询问有关在 Rstudio 中使用参数测试脚本的问题。这个答案给出了。
【解决方案2】:

我知道这个问题很老,下面的链接也很老,但它回答了这个问题。不,无法(或截至 2012 年 1 月 29 日)无法从 RStudio 访问命令行参数。

链接 https://support.rstudio.com/hc/communities/public/questions/200659066-Accessing-command-line-options-in-RStudio?locale=en-us

【讨论】:

  • 这在技术上可能是正确的,但显然有可能(并且一直有可能)通过 system("rscript myscript.r -a -b -c") 传递参数,可以从 RStudio 控制台执行 - 请参阅 @biocyberman 的答案,我认为应该成为公认的答案
  • 是的,这是可能的,这应该不再是公认的答案。 commandArgs 会这样做。
  • 链接失效了,这并不奇怪。
【解决方案3】:

您可以使用Rscript programname.r arg1 arg2 arg3 调用您的程序。参数被传递给commandArgs,因此以下情况为真:

Rscript programname.r F N 32

> args <- commandArgs(trailingOnly=TRUE)
> args[1]
[1] F
> args[2]
[1] N
> args[3]
[1] 32

【讨论】:

    【解决方案4】:

    这对我有用: 我的Rscript如下:

    args <- commandArgs()
    print(paste0("args:", args))
    print(paste0("args[1]:",args[1]))
    print(paste0("args[2]:",args[2]))
    print(paste0("args[3]:",args[3]))
    print(paste0("# of args:",length(args)))
    

    '

    为了模拟我将在 Rscript 中使用的命令行输入,我在 RStudio 中输入了这个:

    commandArgs &lt;- function() c("AMZN", 10, 200)

    它给出了预期的结果:

    [1] "args:AMZN" "args:10"   "args:200" 
    [1] "args[1]:AMZN"
    [1] "args[2]:10"
    [1] "args[3]:200"
    [1] "# of args:3"
    

    【讨论】:

    • 您永久更改函数commandArgs()。恕我直言,这是一个糟糕的解决方案。
    • 恕我直言,用于测试的单个 R 会话不符合“永久”的条件..
    【解决方案5】:

    如果您有兴趣使用例如argparser 并继续使用 Rstudio 进行交互式开发/分析,您可以使用以下解决方法:

    1. my_rscript 中编写您的命令行解析器,并创建一个包含所有已解析输入的对象args
    2. 添加一行将args 对象保存到文件中。
    3. 从命令行运行my_rscript 并指定感兴趣的参数。
    4. 从 Rstudio 的文件中加载 args 对象并以交互方式继续

    例子:

    library("argparser")
    parser <- arg_parser(description='Process commandline arguments')
    parser <- add_argument(parser, arg="--dataset", type="character", help = "Dataset argument")
    args = parse_args(parser)
    args_file = "tempArgObjectFile.rds"
    saveRDS(args, args_file); print(args); quit(); #comment this after creating args_file
    args = readRDS(args_file)  #use this to load during interactive development
    

    【讨论】:

      【解决方案6】:

      这真的很老了,但是我在尝试做同样的事情时偶然发现了它,我最终只是尝试了以下方法,如果人们想尝试它,它又好又快(可能只对具有几个简单的参数):

      鉴于我当前启动的 Rscript:

      args <- commandArgs(TRUE)
      df <- read.csv(args[1], sep=",", check.names=FALSE, row.names = 1)
      .
      . # Do some analysis and plotting etc.
      .
      

      如果我想模拟 Rscript 否则会收到的命令行,您可以“手动”将 args 向量向上:

      args <- c("/path/to/my/inputfile.csv")
      

      然后args[1] 会采用与以往相同的值。我只是通过在 RStudio 中突出显示和执行来运行脚本中的所有其他内容。

      【讨论】:

      • 您如何在脚本外部设置args 以使脚本内部的args &lt;- commandArgs(TRUE) 不会覆盖它们?
      • @U.Windl 坦率地说你不能。此答案未按书面形式回答问题,尽管它可能对将来找到该问题的人有用。
      • 是的,这并不是为了完全符合最初的 OP 目标,但我发现它是一个简单的“黑客”,其他人以后可能会发现它有用。
      【解决方案7】:

      虽然 Rstudio 中仍未内置此行为,但有几种方法可以帮助您实现所需的工作流程。

      1。互动提示

      readlinemenu 函数允许您通过在终端中添加提示并接受输入作为响应来使您的脚本具有交互性。因此,如果您主要关心的不是每次在 Rstudio 中运行时都修改脚本,那么您可以设置一系列这些命令来每次都输入您的参数,如下所示:

      x <- readline("What is your quest? ")
      y <- menu(title = "What is your favorite color?", choices = c("Blue", "Clear"))
      
      print(paste("Your quest is", x))
      if (y == 1) print("Aaaaaargh!")
      

      2。检测交互模式

      一个相关的问题是希望能够在 Rstudio 中工作时更改脚本的参数,但不会阻止脚本在命令行上使用。这是脚本中硬编码参数的问题。虽然替换或覆盖commandArgs 可以更轻松地在一个地方提供所有参数,当需要使用完成的代码时可以将其注释掉,但这仍然不能解决问题。相反,请考虑检测您是否处于交互模式并相应地处理参数:

      if (interactive()) {
        opts <- c('grail')
      } else {
        opts <- commandArgs(trailingOnly = TRUE)
      }
      
      print(paste("I seek the", opts[1]))
      

      3。使用 optparse 的默认值

      如果您使用 optparse,它会变得更加容易。只需将每次调用中的default 参数设置为make_option,这将在您以交互方式运行程序时使用。这也可以与上述任一工作流程结合使用。

      library(optparse)
      opt_list <- list(make_option(
          c("--quest"),
          dest = 'your_quest',
          type = 'character',
          default = "the grail"
      ))
      
      opt_parser <- OptionParser(option_list = opt_list)
      opt <- parse_args(opt_parser)
      
      print(paste("You seek", opt$your_quest))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        相关资源
        最近更新 更多