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

3

有没有可能调试一个使用Rscript.exe执行的R源文件?

最初的回答
> Rscript.exe mysource.R various parameters


理想情况下,我希望能在RStudio的mysource.R文件中的某个位置设置断点。 例如,是否可以直接在命令行中输入R调试器,通过向源文件添加一些调试指令来实现?
也许从R中源代码会起作用?如何操作?如何传递命令行参数“各种参数”,以便commandArgs()返回正确的值?
mysource.R可能如下所示(在实际操作中更为复杂)。
#!/usr/bin/Rscript

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



2个回答

3
就控制台调试而言,有一些相关问题没有答案。 在RStudio中调试RScript调用的方法使用命令行调试RScript 。因此,我不确定是否有什么改变,以及现在是否可能。然而,我们可以通过使用一个技巧来从源文件进行调试。您可以在文件中添加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"

0

在命令行中没有本地调试Rscript的方法,但是您可以使用我用readLineseval编写的一种hacky解决方法。

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...")
    }
  }
}

在R文件中的示例用法,可通过Rscript调用:

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() 检索它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接