[R] [External] Re: Parser For Line Number Tracing

iuke-tier@ey m@iii@g oii uiow@@edu iuke-tier@ey m@iii@g oii uiow@@edu
Sun Jan 19 17:46:30 CET 2025


On Sun, 19 Jan 2025, 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.

No. There are already many ways to influence the way the default error
handler prints information about errors, mstly via options(). In
particular you may want to look at entries in ?options for

show.error.locations
showErrorCalls
showWarningCalls

and adjust your options settings accordingly.

Best,

luke

>
> 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
>>
>>
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.r-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

-- 
Luke Tierney
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:   luke-tierney using uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu/


More information about the R-help mailing list