witek
witek

Reputation: 1044

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

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)



Upvotes: 5

Views: 3687

Answers (2)

jpd527
jpd527

Reputation: 1551

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().

Upvotes: 1

Ronak Shah
Ronak Shah

Reputation: 388982

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"

Upvotes: 3

Related Questions