2016-04-14 15 views
1

Frager glänzend - uiOutput nicht innerhalb menuItem Rendering

Warum ein sliderInput(), die mit uiOutput() auf die ui auf den server und gerendert generiert wird nicht in einem menuItem() angezeigt werden?

Beispiel

In dieser einfachen Anwendung ich ein sliderInput auf den server bin zu erzeugen (man beachte die menuItem bewusst auf Kommentar), und es funktioniert wie erwartet

library(shiny) 
library(shinydashboard) 

rm(ui, server) 

ui <- dashboardPage(
    dashboardHeader(), 

    dashboardSidebar(
     sidebarMenu(
      #menuItem(text = "data options", 
         checkboxGroupInput(inputId = "cbg_group1", label = "group 1", 
             choices = c("some","check","boxes","to","choose","from")), 
         uiOutput("sli_val1"), 
         checkboxGroupInput(inputId = "cbg_group2", label = "group 2", 
              choices = c("another","set","of","check","boxes")), 
      #    ), 
      menuItem(text = "another tab") 
      ) 
    ), 
    dashboardBody() 
) 

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

    withProgress(message = "loading page", value=0.1, { 
     ## simulate loading some data 
     Sys.sleep(3) 

     ## slider input 
     output$sli_val1 <- renderUI({ 
      sliderInput(inputId = "sli_val1", 
         label = "values", min = 0, max = 100, 
         value = c(25, 75)) 
     }) 
     setProgress(value=1, detail="Complete") 
    }) 
} 

shinyApp(ui = ui, server = server) 

Allerdings, wenn ich Bewegen Sie die uiOutput innerhalb einer menuItem(), die Ausgabe nicht mehr rendert:

+0

Ist [diese] (http://stackoverflow.com/questions/33430813/using-uioutput-in -menusubitem-of-shinydashboard? rq = 1) Antwort auf Ihre Frage? –

+0

@MikaelJumppanen - nicht ganz: Ich benutze 'menuSubItem()' nicht, so dass ich den 'tabName' nicht definieren kann – SymbolixAU

Antwort

2

Zuerst würde ich uiOutput("sli_val1") in uiOutput("out_sli_val1") ändern, um doppelte Ids zu verhindern.

Zu Ihrem Problem: Dies ist eine seltsame Sache, wenn Shiny das Dokument durchläuft und alle möglichen Ausgaben rendert/bindet. Die Standardaktion besteht darin, alle ausgeblendeten Ausgabeelemente zu ignorieren - das heißt, nicht vollständig zu ignorieren (die Ausgabe "sli_val1" ist in Ordnung), aber ihre Funktion ist ausgesetzt, so dass keine Kinder gerendert werden können.

Das Problem ist also, dass diese Ausgabe bei der Initiierung in der Unterpunktstruktur versteckt und von dort ignoriert wird.

Das Update kann

outputOptions(output, "out_sli_val1", suspendWhenHidden = FALSE) 

Aber wie und wo durch den Aufruf von Lösen dieses supension Verhaltens getan werden? Diese Option muss festgelegt werden, bevor Sie Ihre Daten laden können. Aber es wird Fehler werfen, wenn output$out_sli_val1 nichts zugewiesen ist (ist NULL). Um dies zu vermeiden, kann man einen leeren UI-Chunk initialisieren, der beim "Datenladen" überschrieben wird.

Hier ist Ihre minimale fix mit 2 zusätzlichen Codezeilen (und modifizierte Ausgabe Id):

library(shiny) 
library(shinydashboard) 

ui <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(
    sidebarMenu(
     menuItem(text = "data options", 
     checkboxGroupInput(inputId = "cbg_group1", label = "group 1", 
          choices = c("some","check","boxes","to","choose","from")), 
     uiOutput("out_sli_val1"), 
     checkboxGroupInput(inputId = "cbg_group2", label = "group 2", 
          choices = c("another","set","of","check","boxes")) 
    ), 
     menuItem(text = "another tab") 
    ) 
), 
    dashboardBody() 
) 

server <- function(input, output, session){ 
    output$out_sli_val1 <- renderUI({}) 
    outputOptions(output, "out_sli_val1", suspendWhenHidden = FALSE) 

    withProgress(message = "loading page", value=0.1, { 
    ## simulate loading some data 
    Sys.sleep(3) 

    ## slider input 
    output$out_sli_val1 <- renderUI({ 
     sliderInput(inputId = "sli_val1", label = "values", min = 0, max = 100, value = c(25, 75)) 
    }) 

    setProgress(value=1, detail="Complete") 
    }) 
} 

shinyApp(ui = ui, server = server) 
+0

Schöne Antwort! Wie hast du das Debuggen gemacht? –

+2

@MikaelJumppanen Ich dachte, ich hätte irgendwo etwas über dieses versteckte Problem gelesen. Also habe ich angefangen zu versuchen, die Ausgabe manuell zu lösen/binden (Costom Nachrichtenhandler + actionbutton) und schaute auf den HTML, wenn der Ausgabezweig reagierte. Und überraschenderweise tat es, sobald das SubMenu sichtbar war. Ich habe versucht, die Bindung zu dieser Sichtbarkeit zu verknüpfen (wäre sehr getippt gewesen), habe aber diesen einfacheren Ansatz gefunden. Die leere renderUI init war eine Ahnung. –

+0

Ich bin mir nicht sicher, ob dies beabsichtigt ist. –

Verwandte Themen