3

Is it possible to debug an R source file which is executed with Rscript.exe?

> Rscript.exe mysource.R various parameters

Ideally, I would like to be able to set a break-point somewhere in the mysource.R file in RStudio. Is entering the R debugger directly at the command line possible for instance by adding some debug directive to the source file?

Maybe sourcing the file from R would work? How? How do I pass the command line arguments "various parameters" so that commandArgs() returns the correct values?

The mysource.R could look as follows (in practice it is much more complicated).

#!/usr/bin/Rscript

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



witek
  • 984
  • 1
  • 8
  • 25

2 Answers2

3

As far as debugging from console is concerned there are few questions related to it without an answer.

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

So, I am not sure if something has changed and if it is now possible.

However, we can debug from sourcing the file by using a hack. You could add browser() in the file wherever you want to debug. Consider your main file as :

main.R

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

Now, we can override the commandArgs function and pass whatever arguments we want to pass which will be passed when you source the file.

calling_file.R

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

After running the source command, you could debug from there

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

#[[2]]
#[1] "a" "b" "c"
Ronak Shah
  • 377,200
  • 20
  • 156
  • 213
0

There's no native way to debug Rscript in the command line, but you can use a kind of hacky workaround I whipped up with readLines and eval.

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

Example usage in an R file to be called with Rscript:

ipdbrtest.R

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

Command line:

$ 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

If you're considering using R instead of Rscript, you could pass it environment variables and retrieve them with Sys.getenv().

jpd527
  • 1,543
  • 1
  • 14
  • 30