一个证明问题的最小例子:
library(shiny)
library(shinydashboard)
ui <- dashboardPage(
dashboardHeader(title='Dashboard'),
dashboardSidebar(
sidebarMenu(
menuItem('Dashboard', tabName='dashboard', icon=icon('dashboard'))
)
),
dashboardBody(
tabItems(
tabItem(tabName = 'dashboard',
fluidRow(
tabBox(
id='dashboard_tabs',
tabPanel(
title='Tab 1',
uiOutput('tab1Content')
),
tabPanel(
title='Tab 2',
uiOutput('tab2Content')
),
width=8
),
box(
title='Input summary',
uiOutput('summary'),
width=4
)
),
actionButton('update', 'Update summary')
)
)
)
)
server <- function(input, output, session) {
state <- reactiveValues(
input1=NULL,
input2=NULL
)
observeEvent(input$update, {
state$input1 <- input$input1
state$input2 <- input$input2
})
output$summary <- renderUI({
shiny::tags$ul(
shiny::tags$li(
strong('Input 1: '),
state$input1
),
shiny::tags$li(
strong('Input 2: '),
state$input2
)
)
})
output$tab1Content <- renderUI(
textInput('input1', 'Input 1', value=1)
)
output$tab2Content <- renderUI(
textInput('input2', 'Input 2', value=2)
)
}
shinyApp(ui, server)
如果运行此示例,请点击“更新”按钮。按钮,摘要框(右)仅显示&#39;输入1&#39;的值。如果表单没有标签或者输入是通过uiOutput + renderUI直接在ui呈现的,那么这不会发生,所以这对于标签和uiOutput来说似乎都是不好的行为。
那么,如果在导航到这些标签之前通过renderUI 呈现标签,那么从选项卡式表单获取输入值的方法是什么?
EDIT1 :修复了示例代码中的拼写错误。 EDIT2 :示例代码显示真正的问题,上一版本没有。
答案 0 :(得分:0)
Ther是您的代码中的错误,在sedcond选项卡中,您应该写:
textInput('input2', 'Input 2', value=2)
而不是
textInput('input1', 'Input 2', value=2)
拼写纠错后
那么,这可能是你的解决方案:
library(shiny)
library(shinydashboard)
ui <- dashboardPage(
dashboardHeader(title='Dashboard'),
dashboardSidebar(
sidebarMenu(
menuItem('Dashboard', tabName='dashboard', icon=icon('dashboard'))
)
),
dashboardBody(
tabItems(
tabItem(tabName = 'dashboard',
fluidRow(uiOutput("ui")
,
box(
title='Input summary',
uiOutput('summary'),
width=4
)
),
actionButton('update', 'Update summary')
)
)
)
)
server <- function(input, output, session) {
state <- reactiveValues(
input1=1,
input2=2
)
observeEvent(input$update, {
state$input1 <- input$input1
state$input2 <- input$input2
})
output$summary <- renderUI({
shiny::tags$ul(
shiny::tags$li(
strong('Input 1: '),
state$input1
),
shiny::tags$li(
strong('Input 2: '),
state$input2
)
)
})
output$ui <- renderUI({
tabBox(
id='dashboard_tabs',
tabPanel(
title='Tab 1',
uiOutput('tab1Content'), textInput('input1', 'Input 1', value=1)
),
tabPanel(
title='Tab 2',
uiOutput('tab2Content'),textInput('input2', 'Input 2', value=2)
),
width=8
)
})
}
shinyApp(ui, server)