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

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Mon Jan 20 23:56:20 CET 2025


I've posted a patch to bugs.r-project.org that fixes the traceback() 
issue.  It's not specific to findFun3; you get the same problem with 
errors from expressions like

  1 + "a"

In my testing, I occasionally saw cases where show.error.locations = 
TRUE didn't work.  I'll try to track down a reproducible case, and 
perhaps a patch to fix it.

Duncan Murdoch



On 2025-01-20 9:37 a.m., Duncan Murdoch wrote:
> Sorry, I'm not seeing the first problem now:
> options(show.error.locations = TRUE) works fine.  Not sure what I did
> wrong before.
> 
> I'm still seeing `traceback()` failing to report the attempt to call
> nofunction().  I suppose this is because a context is never set up for
> the failed call.  Perhaps findFun3 could set up a fake context so that
> traceback() adds one more entry?
> 
> Duncan Murdoch
> 
> 
> On 2025-01-19 3:39 p.m., Duncan Murdoch wrote:
>> 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