【问题标题】:How to get form input values in tabbed forms如何在选项卡式表单中获取表单输入值
【发布时间】:2018-02-14 19:12:17
【问题描述】:

一个演示问题的最小示例:

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)

如果运行此示例并单击“更新”按钮,则摘要框(右)仅显示“输入 1”的值。如果表单没有选项卡,或者输入直接在 ui 上而不是通过 uiOutput+renderUI 呈现,则不会发生这种情况,因此这似乎是选项卡和 uiOutput 的一种不良行为。

那么,如果标签是通过 renderUI 呈现的, 导航到这些标签之前,从标签表单获取输入值的方法是什么?

EDIT1:修正了示例代码中的拼写错误。 EDIT2:显示真正问题的示例代码,上一个版本没有。

【问题讨论】:

    标签: r shiny shinydashboard


    【解决方案1】:

    你的代码有错误,在 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)
    

    【讨论】:

    • 编辑了问题以显示真正的问题......正如你所说,我之前发布的示例代码由于拼写错误而失败,而不是因为我试图显示的问题。
    • 感谢您的回复...它之所以有效,是因为当 output$ui 被渲染时,所有选项卡都会立即渲染,如果每个选项卡都在其自己的 uiOutput() 中,则不会发生这种情况,这是我问的。
    • 所以我的问题真的是:如果不可见,是否可以强制呈现 ui 内容?这似乎不是一个选择......我会保持这个问题开放一段时间,但我认为没有不包括某种黑客的解决方案。
    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2011-12-28
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多