如何以选项卡的形式获取表单输入值

时间:2018-02-14 09:24:28

标签: r shiny shinydashboard

一个证明问题的最小例子:

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 :示例代码显示真正的问题,上一版本没有。

1 个答案:

答案 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)