2015-08-04 6 views
10

Eksperymentuję z Shiny App, aby wyświetlać dynamiczne konteksty, ale nie mogę uzyskać renderDataTable działającego na komponent renderUi.Używanie renderDataTable w renderUi w Shiny

Poniżej dwa proste powtarzalne testy: pierwszy nie działa, drugi bez renderUi działa dobrze, oczywiście.

Jaka jest różnica między tymi dwiema koncepcjami i dlaczego pierwsza nie może działać w wersji Shiny?

Ten nie działa: należy zauważyć, że uiOutput "myTable" zawiera dwa komponenty reaktywne, selectInput i renderDataTable, ale tylko selectInput jest renderowany.

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)) 
        ) 
      }) 
    } 
)) 

To jest w porządku, zarówno selectInput i renderDataTable są renderowane:

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) 
    } 
)) 

Jak dostać pracę pierwszy scenariusz?

Dzięki.

EDYCJA po Yihui komentarzu (dzięki Yihui):

W renderUi musi być stosowany jakąś funkcję UI, a nie jakąś funkcję render: zmienił przykładowy kod w prawidłowy sposób, wynik nie zmienia: nadal żadne dane nie są wyświetlane.

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

EDIT n.2

Wystarczy rozwiązany, dostał pracę tak:

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

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

muszę zapisać renderTableOutput w zmiennej wyjściowej pierwszy, a następnie wprowadzenie go do dataTableOutput.

Dzięki za naprowadzenie mnie na: https://groups.google.com/d/msgid/shiny-discuss/d9bf5ede-7403-4a42-9831-fa9e0c0974d3%40googlegroups.com?utm_medium=email&utm_source=footer

+0

Prawdopodobnie to samo pytanie jak https://groups.google. pl/d/msgid/shiny-discuss/d9bf5ede-7403-4a42-9831-fa9e0c0974d3% 40googlegroups.com? utm_medium = email & utm_source = footer –

+0

dzięki Yihui, zaktualizowałem pytanie nowym kodem po przejrzeniu odpowiedzi w https: // groups.google.com/d/msgid/shiny-discuss/d9bf5ede-7403-4a42-9831-fa9e0c0974d3%40googlegro ups.com?utm_medium=email&utm_source=footer. , ale wciąż nie ma szczęścia. – curious

+0

Nie mogę zrozumieć, dlaczego chcesz "obudować" 'renderDataTable' wewnątrz' renderUI' ... Jeśli musisz utworzyć "złożoną strukturę", nie możesz użyć 'fluidPage' /' fluidRow'/'column'/'div'/... z jednym lub więcej' * output'? –

Odpowiedz

0

Byłoby jaśniejsze jeśli podzielić część datatable generacji i ui generacja:

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