Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Incomplete stack trace reported when code in a shiny app observer fails #2040

Open
mlell opened this issue Dec 12, 2024 · 0 comments
Open

Incomplete stack trace reported when code in a shiny app observer fails #2040

mlell opened this issue Dec 12, 2024 · 0 comments

Comments

@mlell
Copy link

mlell commented Dec 12, 2024

When testing code happening with test_that() inside a shiny app using shiny::testServer() and an error happens inside shiny::observeEvent({...}) the error location is not reported in the stack trace generated by test_that(). It is only reported by the default handler output that is generated by shiny. In the reproducible example, the stack trace stops at setInputs() rather than following the functions that are called as a results of setInputs() being called.

The expected result would be that testthat and shiny report the same error source, the function "stop()" in the function x(), and give as file and line number test.R:6.

Example application or steps to reproduce the problem

# File "test.R"
library(testthat)
library(shiny)

x <- function(a){
  stop("test")
}

testServer(list(
  ui = flowLayout(actionButton("button", "Push me")), 
  server = function(input, output, session){
    observeEvent(input$button, {
      rlang::try_fetch(
      x(3)
      , error = function(e) rlang::abort("Error in observer", parent = e)
    )
  })
    
  }), {
  test_that("x",{
    session$setInputs(button = 1L)
  })
})

Output:

# [ Full `shiny` stack trace =============================================== ]
  131: <Anonymous>
  130: signalCondition
  129: signal_abort [/tmp/RtmpXwi0DI/R.INSTALL279488583bf75f/rlang/R/cnd-abort.R#861]
  128: rlang::abort [/tmp/RtmpXwi0DI/R.INSTALL279488583bf75f/rlang/R/cnd-abort.R#390]
  127: handlers[[1L]] [~/test.R#14]
  126: h [/tmp/RtmpXwi0DI/R.INSTALL279488583bf75f/rlang/R/cnd-handlers.R#223]
  125: .handleSimpleError
  124: stop
  123: x [~/test.R#5]
  116: observe [~/test.R#12]
  115: <observer:observeEvent(input$button)> [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/utils.R#1459]
  113: valueFunc [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/utils.R#1449]
   96: func [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/bind-event.R#298]
   94: f [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/utils.R#1532]
   93: Reduce
   84: do [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/utils.R#1518]
   83: hybrid_chain [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/utils.R#1558]
   82: observeEvent(input$button) [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/bind-event.R#280]
   81: contextFunc [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/utils.R#1451]
   80: env$runWith [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/react.R#160]
   69: ctx$run [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/react.R#54]
   68: run [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/reactives.R#1234]
   49: flushCallback [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/reactives.R#1204]
   48: FUN [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/react.R#114]
   47: lapply
   46: ctx$executeFlushCallbacks [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/react.R#113]
   45: .getReactiveEnvironment()$flush [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/react.R#182]
   44: shiny:::flushReact [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/react.R#202]
   43: private$flush [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/mock-session.R#692]
   42: session$setInputs [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/mock-session.R#370]
   41: eval [~/test.R#20]
   40: eval
   31: test_code [/tmp/RtmpXdwe80/R.INSTALLf9c3cb9ccd7/r-lib-testthat-dbe8883/R/test-that.R#188]
   30: test_that [/tmp/RtmpXdwe80/R.INSTALLf9c3cb9ccd7/r-lib-testthat-dbe8883/R/test-that.R#53]
   29: rlang::eval_tidy [~/test.R#19]
    5: testServer [/tmp/Rtmp2wImAI/R.INSTALLe8961d20769/rstudio-shiny-9a35b01/R/test-server.R#121]
    4: eval [~/test.R#8]
    3: eval
    1: source
── Warning: x ─────────────────────────
Error in observe: Error in observer
Caused by error in `x()`:
! test
# [ Incomplete "test_that" stack trace ================================= ]
Backtrace:
     ▆
  1. └─session$setInputs(button = 1L) at ~/test.R:20:5
  2.   └─private$flush() at rstudio-shiny-9a35b01/R/mock-session.R:370:7
  3.     └─shiny:::flushReact() at rstudio-shiny-9a35b01/R/mock-session.R:692:7
  4.       └─.getReactiveEnvironment()$flush() at rstudio-shiny-9a35b01/R/react.R:202:3
  5.         └─ctx$executeFlushCallbacks() at rstudio-shiny-9a35b01/R/react.R:182:9
  6.           └─base::lapply(...) at rstudio-shiny-9a35b01/R/react.R:113:7
  7.             └─shiny (local) FUN(X[[i]], ...)
  8.               └─shiny (local) flushCallback() at rstudio-shiny-9a35b01/R/react.R:114:9
  9.                 └─shiny:::hybrid_chain(...) at rstudio-shiny-9a35b01/R/reactives.R:1204:9
 10.                   └─shiny (local) do() at rstudio-shiny-9a35b01/R/utils.R:1558:5
 11.                     └─base::tryCatch(...) at rstudio-shiny-9a35b01/R/utils.R:1518:5
 12.                       └─base (local) tryCatchList(expr, classes, parentenv, handlers)
 13.                         └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
 14.                           └─value[[3L]](cond)
 15.                             └─shiny (local) catch(e) at rstudio-shiny-9a35b01/R/utils.R:1546:9
 16.                               └─shiny::printError(e) at rstudio-shiny-9a35b01/R/reactives.R:1220:13

── Skip: x ────────────────────────────
Reason: empty test

System details

Browser Version: n/a

Output of sessionInfo():

R version 4.2.2 Patched (2022-11-10 r83330)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 12 (bookworm)

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
[1] testthat_3.2.1.1 shiny_1.9.1.9000

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.13       rstudioapi_0.16.0 magrittr_2.0.3    pkgload_1.4.0     xtable_1.8-4      R6_2.5.1          rlang_1.1.4      
 [8] fastmap_1.2.0     tools_4.2.2       waldo_0.6.1       cli_3.6.3         withr_3.0.1       htmltools_0.5.8.1 digest_0.6.37    
[15] rprojroot_2.0.4   lifecycle_1.0.4   crayon_1.5.3      brio_1.1.5        later_1.3.2       promises_1.3.2    cachem_1.1.0     
[22] mime_0.12         compiler_4.2.2    desc_1.4.3        httpuv_1.6.15     renv_1.0.7 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant