如何在Shiny应用程序中访问/打印/跟踪当前选项卡选项?

时间:2016-08-10 02:15:51

标签: r session tabs shiny

我正在一个闪亮的应用程序中工作,我希望能够访问用户在会话中使用的当前选项卡上的信息。

我有一个侦听事件,侦听要单击的特定按钮。简单来说,我想存储/打印用户单击此按钮时当前的选项卡。点击此按钮后,标签会更改为“帮助”。使用updateTabItems,它将session,inputId和所选值作为参数。

# Observe event when someone clicks a button
observeEvent(input$help, {
  # if they are logged in
  if(USER$Logged == TRUE) {

     # current_tab <- ???
     shiny_session <<- session
    updateTabItems(session, "sidebar", selected = "help")
  }
})

由于会话具有一些价值,我试图探索它。

> class(shiny_session)
[1] "ShinySession" "R6"

> names(shiny_session)
 [1] ".__enclos_env__"     "session"            
 [3] "groups"              "user"               
 [5] "singletons"          "request"            
 [7] "closed"              "downloads"          
 [9] "files"               "token"              
[11] "clientData"          "output"             
[13] "input"               "progressStack"      
[15] "clone"               "decrementBusyCount" 
[17] "incrementBusyCount"  "outputOptions"      
[19] "manageInputs"        "manageHiddenOutputs"
[21] "registerDataObj"     "registerDownload"   
[23] "fileUrl"             "saveFileUrl"        
[25] "handleRequest"       "@uploadEnd"         
[27] "@uploadInit"         "@uploadieFinish"    
[29] "reload"              "reactlog"           
[31] "onFlushed"           "onFlush"            
[33] "sendInputMessage"    "sendCustomMessage"  
[35] "dispatch"            "sendProgress"       
[37] "showProgress"        "flushOutput"        
[39] "defineOutput"        "setShowcase"        
[41] "isEnded"             "isClosed"           
[43] "wsClosed"            "close"              
[45] "unhandledError"      "onInputReceived"    
[47] "onEnded"             "onSessionEnded"     
[49] "ns"                  "makeScope"          
[51] "initialize"

我试图探索闪亮会话的这些元素,它们大多是按功能构建的,在当前选项卡上找不到任何内容。

UpdateTabItems似乎接受值并将它们发送到sendInputMessage。

> updateTabItems
function (session, inputId, selected = NULL) 
{
    message <- dropNulls(list(value = selected))
    session$sendInputMessage(inputId, message)
}

这似乎是在闪亮的应用程序中执行的某种命令堆栈,所以我不再探索它。

> shiny_session$sendInputMessage
function (inputId, message) 
{
    data <- list(id = inputId, message = message)
    private$inputMessageQueue[[length(private$inputMessageQueue) + 
        1]] <- data
}

有关如何在给定时间点访问变量中当前选项卡信息的任何建议吗?

感谢。

1 个答案:

答案 0 :(得分:9)

由于你没有提供minimal reproducible example,我必须做出一些猜测来产生一个合适的例子 - 但它没关系:)看来你正在使用shinydashboard并在应用程序中有sidebarMenu至少有两个标签。

  

我希望能够在会话中访问用户所在的当前选项卡上的信息。

您可以sidebarMenu IDtabs,然后您可以通过input$tabs访问当前标签上的信息。

让我们看看下面的一个例子,它突出了这两个方面

首先,我们使用唯一的sidebarMenu

“奖励”ID
sidebarMenu(id = "tabs", 
      menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),
      menuItem("Help", tabName = "help", icon = icon("h-square"))
    )

然后使用

在服务器端窥探它
observe({
    print(input$tabs)
  })

完整示例:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(title = "Example"),
  dashboardSidebar(
    sidebarMenu(id = "tabs", # note the id
      menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")),
      menuItem("Help", tabName = "help", icon = icon("h-square"))
    ),
    br(),
    # Teleporting button
    actionButton("teleportation", "Teleport to HELP", icon = icon("h-square"))
  ),
  dashboardBody(
    tabItems(
      tabItem(tabName = "dashboard",
              h2("Dashboard tab content")
      ),
      tabItem(tabName = "help",
              h2("Help tab content")
      )
    )
  )
)

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

  # prints acutall tab
  observe({
    print(input$tabs)
  })

  observeEvent(input$teleportation, {
    # if (USER$Logged == TRUE) {
    if (input$tabs != "help") { 
      # it requires an ID of sidebarMenu (in this case)
      updateTabItems(session, inputId = "tabs", selected = "help") 
    }
    #}
  })
}

shinyApp(ui, server)