【问题标题】:How can I navigate longer tabs in R shiny?如何在 R Shiny 中导航更长的标签?
【发布时间】:2021-06-25 06:36:59
【问题描述】:

我有一个闪亮的应用程序,带有侧边栏菜单和几个不同的选项卡。在每个选项卡中,有很多内容应该一起看到,所以选项卡很长,导航可能很痛苦,因为需要大量滚动。但是,将内容拆分为子选项卡不是一种选择。

因此,我尝试将“位置标记”作为虚假的子标签来导航,但我的努力没有成功。 我在这里尝试做的是使用闪亮功能 scroll.position 首先选择“位置标记”所在的选项卡,然后向下滚动到内容的位置。 如您所见,这种方法的问题在于,observeEvent 在函数内调用自身,因此永远不会在所需位置结束,而是转到该位置然后返回选项卡顶部。

这是我尝试做的一个最小的工作示例:

library(shiny)
library(shinydashboard)
library(shinyjs)

ui <- dashboardPage(
                    dashboardHeader(title = "Dashboard", titleWidth = 350),
                    dashboardSidebar(
                      width = 350, 
                      disable = FALSE,
                      sidebarMenu(id = "Tabs", 
                                  menuItem(text = "This is basically just the header for the first tab",
                                           tabName = "Tab_Menue",
                                             menuSubItem(text = "This is the actual tab",
                                                         tabName = "Tab_1"
                                                         ),
                                             menuSubItem(text = "This is just for navigating the page",
                                                         tabName = "Not_an_actual_Tab_1"
                                                         )
                                           ),
                                  menuItem(text = "This is the header for the 2nd tab",
                                           tabName = "Tab_Menue",
                                             menuSubItem(text = "This is the 2nd actual tab",
                                                         tabName = "Tab_2"
                                                         ),
                                             menuSubItem(text = "This is just for navigating the page in tab 2",
                                                         tabName = "Not_an_actual_Tab_2"
                                                         )
                                  )
                            )
                      ),
                    dashboardBody(
                                  useShinyjs(),
                                  extendShinyjs(text = 'shinyjs.scrollposition = function(y) {window.scrollTo(0, y)};',
                                                functions = c("scrollposition")),
                                  tabItems(
                                    tabItem(
                                            tabName = "Tab_1",
                                            h2("Some content up here that I want to navigate to with Tab_1"),
                                            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
                                            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
                                            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
                                            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
                                            h2("Some content on the same tab/page that I want to navigate to with Not_an_actual_Tab_1")
                                    ),
                                    tabItem(
                                      tabName = "Tab_2",
                                      h2("Some content up here that I want to navigate to with Tab_2"),
                                      br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
                                      br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
                                      br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
                                      br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
                                      h2("Some content on the same tab/page that I want to navigate to with Not_an_actual_Tab_2")
                                    )
                                  )
                         )
)


server <- function(input, output, session) {
  
  observeEvent(input$Tabs, {
    print(input$Tabs) 
    updateTabsetPanel(session, "Tabs", switch(input$Tabs,
                                              "Not_an_actual_Tab_1" = "Tab_1",
                                              "Not_an_actual_Tab_2" = "Tab_2",
                                              input$Tabs)
    )
    js$scrollposition(switch(input$Tabs,
                             "Not_an_actual_Tab_1" = 900,
                             "Not_an_actual_Tab_2" = 900,
                             0)
    )
    
    
  })
  
}

shinyApp(ui = ui, server = server)

解决此问题的一种方法是阻止观察者从自身获取输入(我不知道如何)。 如果您有不同的解决方案,我会很高兴听到它们!

提前致谢!

【问题讨论】:

    标签: r shiny shinydashboard


    【解决方案1】:

    只需向下滚动到您想要去的位置,如下所示。要向上滚动,您可以单击右下角的向上箭头(如图所示)或使用鼠标滚轮滚动。

    library(shiny)
    library(shinydashboard)
    library(shinyjs)
    
    ui <- dashboardPage(
      dashboardHeader(title = "Dashboard", titleWidth = 350),
      dashboardSidebar(
        width = 350,
        disable = FALSE,
        sidebarMenu(id = "Tabs",
                    menuItem(text = "This is basically just the header for the first tab",
                             tabName = "Tab_Menue",
                             menuSubItem(text = "This is the actual tab",
                                         tabName = "Tab_1"
                             ),
                             menuSubItem(text = "This is just for navigating the page",
                                         tabName = "Not_an_actual_Tab_1"
                             )
                    ),
                    menuItem(text = "This is the header for the 2nd tab",
                             tabName = "Tab_Menue",
                             menuSubItem(text = "This is the 2nd actual tab",
                                         tabName = "Tab_2"
                             ),
                             menuSubItem(text = "This is just for navigating the page in tab 2",
                                         tabName = "Not_an_actual_Tab_2"
                             )
                    )
        )
      ),
      dashboardBody(
        useShinyjs(),
        extendShinyjs(text = 'shinyjs.scrollposition = function(y) {window.scrollTo(0, y)};',
                      functions = c("scrollposition")),
        tabItems(
          tabItem(
            tabName = "Tab_1",
            h2("Some content up here that I want to navigate to with Tab_1"),
            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
            h2("Some content on the same tab/page that I want to navigate to with Not_an_actual_Tab_1")
          ),
          tabItem(
            tabName = "Tab_2",
            h2("Some content up here that I want to navigate to with Tab_2"),
            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
            br(), br(), br(), br(), br(), br(), br(), br(), br(), br(), br(),
            h2("Some content on the same tab/page that I want to navigate to with Not_an_actual_Tab_2")
          )
        )
      )
    )
    
    
    server <- function(input, output, session) {
    
      observeEvent(input$Tabs, {
        print(input$Tabs)
        updateTabsetPanel(session, "Tabs", switch(input$Tabs,
                                              "Not_an_actual_Tab_1" = "Tab_1",
                                              "Not_an_actual_Tab_2" = "Tab_2",
                                              input$Tabs)
        )
        if ( sum(c("Not_an_actual_Tab_1","Not_an_actual_Tab_2") %in% input$Tabs)>0) {
          shinyjs::runjs("window.scrollTo(0, 900)")
        }
    
      })
    
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 感谢 YBS!如果我在 Tab_2 中并且想要导航到 Not_an_actual_Tab_1,我必须稍微更改它以切换选项卡,但它完成导航到相应选项卡然后向下滚动的工作。但是,如果单击主选项卡(Tab_1 或 Tab_2),我无法使其也转到顶部(即滚动 0、0)。有什么想法吗?
    • @PaulEagle,我不确定这个问题。当我单击 Tab_1 或 Tab_2 时,它位于顶部。请查看完整代码。
    • 抱歉不清楚,再次感谢。我的问题是,在您的工作示例中,如果您在 Tab_1 上并单击 Not_an_actual_Tab_2,您不会导航到 Tab_2,而是在 Tab_1 中向下滚动。这可以通过我之前指出的解决方案来解决,但是如果单击 Tab_1 或 Tab_2 则滚动到顶部的功能消失了,因为显然单击一个已经处于活动状态的选项卡不会触发 input$Tabs。我希望我能更清楚地说明问题是什么,再次抱歉!
    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2018-06-14
    • 2013-05-05
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多