[R] [External] Re: Parser For Line Number Tracing
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Sun Jan 19 21:39:15 CET 2025
Thanks for pointing out the options. Using
options(show.error.locations = TRUE)
works on Ivo's example, but it doesn't show a location if the error
happens in a function that doesn't have srcrefs, because the known
location isn't on the top of the stack.
Perhaps TRUE (and maybe "top"?) should look back through the stack until
it finds a known location, and report that, or another option (e.g.
"highest"?) could be added to do that.
And still I think traceback() should show the top call in Ivo's example.
Duncan
On 2025-01-19 11:46 a.m., luke-tierney using uiowa.edu wrote:
> 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.
>>
>
More information about the R-help
mailing list