有没有一种方法可以使用 Rscript.exe 从命令行调试 R 脚本 运行

Is there a way to debug an R script run from the command line with Rscript.exe

是否可以调试使用 Rscript.exe 执行的 R 源文件?

> Rscript.exe mysource.R various parameters

理想情况下,我希望能够在 RStudio 的 mysource.R 文件中的某处设置断点。 是否可以直接在命令行进入 R 调试器,例如通过向源文件添加一些调试指令?

也许从 R 获取文件可行?如何?如何传递命令行参数 "various parameters" 以便 commandArgs() returns 获得正确的值?

mysource.R 可能如下所示(实际上要复杂得多)。

#!/usr/bin/Rscript

args <- commandArgs(trailingOnly=TRUE)
print(args)



就从控制台进行调试而言,很少有相关问题没有答案。

Is there a way to debug an RScript call in RStudio? and Rscript debug using command line

因此,我不确定是否发生了某些变化以及现在是否可行。

但是,我们可以使用 hack 从源文件中进行调试。您可以在文件中要调试的任何位置添加 browser()。将您的主文件视为:

main.R

args <- commandArgs(trailingOnly=TRUE)
browser()
print(args)

现在,我们可以覆盖 commandArgs 函数并传递我们想要传递的任何参数,这些参数将在您获取文件时传递。

calling_file.R

commandArgs <- function(...) list(7:9, letters[1:3])
source("main.R")

在 运行 source 命令之后,您可以从那里进行调试

Called from: eval(ei, envir)
#Browse[1]> args
#[[1]]
#[1] 7 8 9

#[[2]]
#[1] "a" "b" "c"

没有在命令行中调试 Rscript 的本机方法,但您可以使用我用 readLineseval.

想出的一种变通方法
ipdb.r <- function(){
  input <- ""
  while(!input %in% c("c","cont","continue"))
  {
    cat("ipdb.r>")
    # stdin connection to work outside interactive session
    input <- readLines("stdin",n=1)
    if(!input %in% c("c","cont","continue","exit"))
    {
      # parent.frame() runs command outside function environment
      print(eval(parse(text=input),parent.frame()))
    }else if(input=="exit")
    {
      stop("Exiting from ipdb.r...")
    }
  }
}

使用 Rscript 调用的 R 文件中的示例用法:

ipdbrtest.R

a <- 3
print(a)
ipdb.r()
print(a)

命令行:

$ Rscript ipdbrtest.R
[1] 3
ipdb.r>a+3
[1] 6
ipdb.r>a+4
[1] 7
ipdb.r>a <- 4
[1] 4
ipdb.r>c
[1] 4

如果您正在考虑使用 R 而不是 Rscript,您可以将环境变量传递给它并使用 Sys.getenv() 检索它们。