Подтвердить что ты не робот

Использование renderDataTable в renderUi в Shiny

Я экспериментирую с Shiny App, чтобы показать динамические контексты, но не могу заставить renderDataTable работать с компонентом renderUi. Ниже приведены два простых реплицируемых теста: первый не работает, второй без renderUi, конечно, работает нормально.

В чем концептуальная разница между этими двумя, и почему первый не может работать в Shiny?

Это не работает: обратите внимание, что uiOutput myTable содержит два реактивных компонента, selectInput и renderDataTable, но selectInput только selectInput.

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

Это нормально, и selectInput и renderDataTable отображаются:

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

Как заставить работать первый сценарий?

Благодарю.

РЕДАКТИРОВАНИЕ после комментария Yihui (спасибо Yihui):

В renderUi должна использоваться какая-то функция пользовательского ui, а не какая-либо функция рендеринга: изменил пример кода правильным образом, результат не изменится: все равно данные не отображаются.

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

РЕДАКТИРОВАТЬ № 2

Только что решил, получилось так:

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

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

Я должен renderTableOutput сохранить renderTableOutput в выходной переменной, а затем dataTableOutput его в dataTableOutput.

Спасибо, что указали мне на: здесь

4b9b3361

Ответ 1

Было бы понятнее, если вы разделите часть генерации datatable и ui:

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