在Shiny中追踪UI警告

前端开发 2026-07-12

下面的Shiny应用将会触发如下警告:

警告:导航容器期望包含一组 bslib::nav\_panel()/shiny::tabPanel()s和/或 bslib::nav\_menu()/shiny::navbarMenu()s。若你希望将内容放在每个面板内容的上方(或下方),请考虑使用 headerfooter

这个警告的原因很清楚。

我想知道是否有办法追踪这个警告的来源(行号)。

这个用例是一个更大的应用,多次调用 shinydashboard::tabBox

我尝试使用 devmode 以及RStudio中的不同调试选项,但到目前为止还没有可用的参考信息。

library(shiny)

devmode()
options(warn = 2, shiny.error = browser, shiny.fullstacktrace = TRUE, shiny.trace = TRUE)

ui <- function(request){
  fluidPage(
    tabsetPanel(
      div("This will raise a warning. What is my linenumber?")
    )
  )
}

server <- function(input, output, session) {}

shinyApp(ui, server)

Here 可以在Posit社区找到一个跨帖。

解决方案

如果ui是一个函数,你可以直接调用ui(),这将结合warn = 2和你设置的其他选项,应该暴露一个可用的调用栈。

library(shiny)

options(warn = 2, error = rlang::entrace)

ui <- function(request){
  fluidPage(
    tabsetPanel(
      div("This will raise a warning. What is my linenumber?")
    )
  )
}

ui()
#> Error:
#> ! (converted from warning) Navigation containers expect a collection of `bslib::nav_panel()`/`shiny::tabPanel()`s and/or `bslib::nav_menu()`/`shiny::navbarMenu()`s. Consider using `header` or `footer` if you wish to place content above (or below) every panel's contents.
rlang::last_trace()
#> <error/rlang_error>
#> Error:
#> ! (converted from warning) Navigation containers expect a collection of `bslib::nav_panel()`/`shiny::tabPanel()`s and/or `bslib::nav_menu()`/`shiny::navbarMenu()`s. Consider using `header` or `footer` if you wish to place content above (or below) every panel's contents.
#> ---
#> Backtrace:
#>      ▆
#>   1. └─global ui()
#>   2.   ├─shiny::fluidPage(tabsetPanel(div("This will raise a warning. What is my linenumber?")))
#>   3.   │ ├─shiny::bootstrapPage(...)
#>   4.   │ │ └─rlang::list2(...)
#>   5.   │ └─htmltools::div(class = "container-fluid", ...)
#>   6.   │   └─rlang::dots_list(...)
#>   7.   └─shiny::tabsetPanel(div("This will raise a warning. What is my linenumber?"))
#>   8.     ├─shiny:::remove_first_class(...)
#>   9.     └─bslib (local) func(..., id = id, selected = selected, header = header, footer = footer)
#>  10.       └─bslib (local) new(...)
#>  11.         └─bslib:::tabsetPanel_(...)
#>  12.           └─bslib:::buildTabset(...)
#>  13.             └─base::lapply(...)
#>  14.               └─bslib (local) FUN(X[[i]], ...)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章