r-lib / slider

Sliding Window Functions
https://slider.r-lib.org
Other
295 stars 12 forks source link

Pass error call through C errors #187

Open DavisVaughan opened 1 year ago

DavisVaughan commented 1 year ago

Or set some kind of local_slider_error_call() before going to C that the R error callbacks can look to for the error call

We started using snapshot tests a lot more in #186, so any improvements will be easily visible. Here are a few cases where the error call either is set to NULL and doesn't show or we throw a base R error

library(slider)

slide_int(1, ~1.5)
#> Error:
#> ! Can't convert from <double> to <integer> due to loss of precision.
#> • Locations: 1

#> Backtrace:
#>      ▆
#>   1. └─slider::slide_int(1, ~1.5)
#>   2.   └─slider:::slide_vec_direct(...) at slider/R/slide.R:295:2
#>   3.     └─slider:::slide_impl(...) at slider/R/slide.R:250:2
#>   4.       └─slider:::slide_common(...) at slider/R/slide.R:430:2
#>   5.         └─slider (local) `<fn>`() at slider/R/slide-common.R:2:2
#>   6.           └─vctrs:::vec_cast.integer.double(...)
#>   7.             └─vctrs::maybe_lossy_cast(...)
#>   8.               ├─base::withRestarts(...)
#>   9.               │ └─base (local) withOneRestart(expr, restarts[[1L]])
#>  10.               │   └─base (local) doWithOneRestart(return(expr), restart)
#>  11.               └─vctrs:::stop_lossy_cast(...)
#>  12.                 └─vctrs::stop_incompatible_cast(...)
#>  13.                   └─vctrs::stop_incompatible_type(...)
#>  14.                     └─vctrs:::stop_incompatible(...)
#>  15.                       └─vctrs:::stop_vctrs(...)
#>  16.                         └─rlang::abort(message, class = c(class, "vctrs_error"), ..., call = vctrs_error_call(call))

slide(1, identity, .before = -1)
#> Error: When `.before` (-1) is negative, it's absolute value (1) cannot be greater than `.after` (0).

slide(1, identity, .before = -1, .after = -1)
#> Error: `.before` (-1) and `.after` (-1) cannot both be negative.

slide(1, identity, .before = "x")
#> Error:
#> ! Can't convert <character> to <integer>.

#> Backtrace:
#>      ▆
#>   1. ├─slider::slide(1, identity, .before = "x")
#>   2. │ └─slider:::slide_impl(...) at slider/R/slide.R:201:2
#>   3. │   └─slider:::slide_common(...) at slider/R/slide.R:430:2
#>   4. └─vctrs (local) `<fn>`() at slider/R/slide-common.R:2:2
#>   5.   └─vctrs::vec_default_cast(...)
#>   6.     ├─base::withRestarts(...)
#>   7.     │ └─base (local) withOneRestart(expr, restarts[[1L]])
#>   8.     │   └─base (local) doWithOneRestart(return(expr), restart)
#>   9.     └─vctrs::stop_incompatible_cast(...)
#>  10.       └─vctrs::stop_incompatible_type(...)
#>  11.         └─vctrs:::stop_incompatible(...)
#>  12.           └─vctrs:::stop_vctrs(...)
#>  13.             └─rlang::abort(message, class = c(class, "vctrs_error"), ..., call = vctrs_error_call(call))

Created on 2022-11-15 with reprex v2.0.2.9000