Я экспериментирую с 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
.
Спасибо, что указали мне на: здесь