[R] Parser For Line Number Tracing
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Sun Jan 19 21:17:05 CET 2025
I think I considered doing that many years ago, but one or more of the
following stopped me:
- It will mess up old test scripts that are checking for the old
format error messages.
- Some errors are due to a severe lack of resources (e.g. full stack,
out of some other kind of memory, etc.) and error reporting for those
has to be done very carefully so as not to crash R.
- The error handling code is pretty hairy, and I was somewhat afraid
of touching it.
On the other hand, it's probably not too hard to write a package that
includes something like my suggestion below and perhaps some other
changes specifically directed at newbies.
So I might suggest looking for that package and writing it if it hasn't
already been written. There are various coding parties each year that
might want to take it on if you don't have time to do so. I've cc'd
Heather Turner, who has been involved in organizing them recently; I
don't know if she's still doing that.
Duncan
On 2025-01-19 10:24 a.m., Ivo Welch wrote:
> Hi Duncan — Wonderful. Thank you. Bug or no bug, I think it would be
> a huge improvement for user-friendliness if R printed the last line by
> default *every time* a script dies. Most computer languages do so.
>
> Should I file it as a request for improvement to the R code
> development team? Maybe R can be improved at a very low cost to the
> development team and a very high benefit to newbies.
>
> Regards,
>
> /ivo
>
> On Sun, Jan 19, 2025 at 2:39 AM Duncan Murdoch <murdoch.duncan using gmail.com> wrote:
>>
>> On 2025-01-18 8:27 p.m., Ivo Welch wrote:
>>> I am afraid my errors are worse! (so are my postings. I should have
>>> given an example.)
>>>
>>> ```
>>> x <- 1
>>> y <- 2
>>> nofunction("something stupid I am doing!")
>>> z <- 4
>>> ```
>>>
>>> and
>>>
>>> ```
>>>> source("where-is-my-water.R")
>>> Error in nofunction("something stupid I am doing!") :
>>> could not find function "nofunction"
>>> ```
>>>
>>> and no traceback is available.
>>
>> Okay, I see. In that case traceback() doesn't report the line, but it
>> still is known internally. You can see it using the following function:
>>
>> showKnownLocations <- function() {
>> calls <- sys.calls()
>> srcrefs <- sapply(calls, function(v) if (!is.null(srcref <- attr(v,
>>
>> "srcref"))) {
>> srcfile <- attr(srcref, "srcfile")
>> paste0(basename(srcfile$filename), "#", srcref[1L])
>> } else ".")
>> cat("Current call stack locations:\n")
>> cat(srcrefs, sep = " ")
>> cat("\n")
>> }
>>
>> I haven't done much testing on this, but I think it can be called
>> explicitly from any location if you want to know how you got there, or
>> you can set it as the error handler using
>>
>> options(error = showKnownLocations)
>>
>> For example, try this script:
>>
>> options(error = showKnownLocations)
>> f <- function() showKnownLocations()
>> x <- 1
>> f()
>> y <- 2
>> nofunction("something stupid I am doing!")
>> z <- 4
>>
>> I see this output from source("test.R"):
>>
>> > source("test.R")
>> Current call stack locations:
>> . . . . test.R#4 test.R#2
>> Error in nofunction("something stupid I am doing!") :
>> could not find function "nofunction"
>> Current call stack locations:
>> . . . . test.R#6
>>
>> The first report is from the explicit call in f() on line 2 that was
>> invoked on line 4, and the second report happens during error handling.
>>
>> I supppose the fact that traceback() isn't showing you the line 6
>> location could be considered a bug.
>>
>> Duncan Murdoch
>>
>>
More information about the R-help
mailing list