2015-08-04 13 views
10

Ich experimentiere mit einer Shiny-App, um dynamische Kontexte anzuzeigen, aber ich kann RenderDataTable nicht in eine RenderUi-Komponente arbeiten.Verwenden von renderDataTable in renderUi in Shiny

Im Folgenden zwei einfache reproduzierbare Tests: der erste funktioniert nicht, der zweite ohne renderUi funktioniert natürlich gut.

Was ist der konzeptionelle Unterschied zwischen diesen beiden, und warum kann der erste nicht in Shiny funktionieren?

Dies funktioniert nicht: Beachten Sie, dass die uiOutput "myTable" enthält zwei reaktive Komponente, eine selectInput und eine renderDataTable, aber nur die selectInput gerendert wird.

library(shiny) 
runApp(list(
    ui = fluidPage(
      fluidRow(h2("where is the table?")), 
      uiOutput('myTable') 
    ), 
    server = function(input, output) { 
      output$myTable <- renderUI({ 
        fluidPage(
          fluidRow(selectInput("test", "test", c(1,2,3))), 
          fluidRow(renderDataTable(iris)) 
        ) 
      }) 
    } 
)) 

Das ist in Ordnung, die beide selectInput und renderDataTable gemacht:

library(shiny) 
runApp(list(
    ui = fluidPage(
      fluidRow(h2("where is the table?")), 
      fluidRow(selectInput("test", "test", c(1,2,3))),     
      fluidRow(dataTableOutput('myTable')) 
    ), 
    server = function(input, output) { 
      output$myTable = renderDataTable(iris) 
    } 
)) 

Wie das erste Szenario zum Laufen bringen?

Danke.

EDITING nach Yihui Kommentar (dank Yihui):

In renderUi hat einige ui-Funktion verwendet werden, und nicht die Funktion einige machen: still: den Beispielcode in der richtigen Art und Weise verändert, ist das Ergebnis nicht ändern keine Daten werden angezeigt.

library(shiny) 
runApp(list(
    ui = basicPage(
      uiOutput('myTable') 
    ), 
    server = function(input, output) { 
      output$myTable <- renderUI({dataTableOutput(iris) 
      }) 
    } 
)) 

EDIT n.2

gerade gelöst, habe es funktioniert so:

library(shiny) 
runApp(list(
    ui = fluidPage(
      mainPanel(

        uiOutput('myTable') 
      ) 
    ), 
    server = function(input, output) { 
      output$myTable <- renderUI({ 
        output$aa <- renderDataTable(iris) 
        dataTableOutput("aa") 
      }) 
    } 
)) 

Ich habe die renderTableOutput in einer Ausgangsgröße zunächst speichern und sie dann zu dataTableOutput Fütterung.

Dank für den Hinweis mich: https://groups.google.com/d/msgid/shiny-discuss/d9bf5ede-7403-4a42-9831-fa9e0c0974d3%40googlegroups.com?utm_medium=email&utm_source=footer

+0

wahrscheinlich die gleiche Frage wie https://groups.google. com/d/msgid/shiny-discuss/d9bf5ede-7403-4a42-9831-fa9e0c0974d3% 40googlegroups.com? utm_medium = email & utm_source = footer –

+0

danke Yihui, ich habe die Frage mit dem neuen Code aktualisiert nachdem ich deine Antwort in https: // überprüft habe groups.google.com/d/msgid/shiny-discuss/d9bf5ede-7403-4a42-9831-fa9e0c0974d3%40googlegro ups.com?utm_medium=email&utm_source=footer. , aber immer noch kein Glück. – curious

+0

Ich kann nicht verstehen, warum Sie "renderDataTable" in "renderUI" "einkapseln" wollen ... Wenn Sie eine "komplexe Struktur" erstellen müssen, können Sie 'fluidPage' /' fluidRow'/'column' nicht verwenden/'div'/... mit einem oder mehreren' * output'? –

Antwort

0

Es wäre klarer, wenn man den Teil der datatable Generation und ui Generation aufgeteilt:

library(shiny) 
runApp(list(
    ui = fluidPage(
      mainPanel(
        uiOutput('myTable') 
      ) 
    ), 
    server = function(input, output) { 
      output$aa <- renderDataTable({iris}) 
      output$myTable <- renderUI({ 
        dataTableOutput("aa") 
      }) 
    } 
)) 
Verwandte Themen