[R] Parser For Line Number Tracing
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Sun Jan 19 02:19:23 CET 2025
On 2025-01-18 6:41 p.m., Ivo Welch wrote:
> I often find myself hunting where in my program an error has happened,
> (of course, in R, many error messages are mysterious in themselves,
> too, making it even harder.) the way I do it is mostly with inserting
> `message()` statements.
>
> what I would really like to have is a parser that inserted 'curline
> <<- ##' into the R code, where '##' is the filename and line number.
> something like 'addtracker one.R two.R' and thereafter I can run two.R
> and, when the program dies, use `print curline` to find out where my
> error has roughly occurred.
>
> has someone already written such an 'instrumenter'?
The basic R parser already does that.
For example, try putting these lines in test.R:
x <- 1
y <- 2
stop("something bad!")
z <- 4
Then run source("test.R"), and it will die with the uninformative message
Error in eval(ei, envir) : something bad!
But then traceback() will show you the line:
> traceback()
5: stop("something bad!") at test.R#3
4: eval(ei, envir)
3: eval(ei, envir)
2: withVisible(eval(ei, envir))
1: source("~/temp/test.R")
See the first line of the traceback? It shows that the problem was on
line 3 of test.R.
If that line was in a function that had been called from somewhere else,
both the function line triggering the error and the line that called the
function would have been shown in different parts of the traceback.
This all depends on calling source() with parameter keep.source = TRUE.
The default value of that parameter is getOption("keep.source"), so if
you're not seeing the line numbers, you may have set that option to FALSE.
Duncan Murdoch
More information about the R-help
mailing list