【问题标题】:How to write a MODULE with two textInputs, in which input in one, blanks out the other and vv?如何用两个 textInputs 编写 MODULE,其中一个输入,另一个和 vv 空白?
【发布时间】:2016-06-18 09:28:28
【问题描述】:

我想编写一个 MODULE,其中客户端函数返回一个带有 2 个文本输入的 taglist。用户可以在 textInput 1 或 textInput 2 中输入值,但不能同时在两者中输入。换句话说,一个 textInput 排除另一个,模拟一组单选按钮。

因此,服务器函数应该以这样的方式观察输入:如果用户在 textInput 1 中输入一个值,那么 textInput 2 将变为空白,反之亦然。 此外,服务器函数返回一个数据框,其中包含 textInputs 中的值,即 data.frame(一 = 输入值,二 = NA)或 data.frame(一 = NA,二 = 输入值)

由于我们计划在我们许多闪亮的应用程序中使用这个两个 textInput 小部件,我真的想把它做成一个模块。实现起来似乎很简单,但到目前为止我还没有成功。 (我的经验是,observe、observeEvent 和 eventReactive 在模块中的工作方式与在常规应用程序中不同)

欢迎任何可以为我指明正确方向的想法。

【问题讨论】:

    标签: module shiny textinput


    【解决方案1】:

    我相信 eventReactive 和 observeEvent 在 Shiny 模块中工作。我创建了一个小模块,基本上可以满足您的描述。

    ui.R

    library(shiny)
    library(shinydashboard)
    
    source("doubleField.R")
    
    shinyUI(dashboardPage(
      dashboardHeader(title = "Test"),
      dashboardSidebar(disable = T),
      dashboardBody(
        doubleFieldUI("fields"),
        fluidRow(
          dataTableOutput("outputTable")
        )
      )
    ))
    

    服务器.R

    library(shiny)
    source("doubleField.R")
    
    shinyServer(function(input, output) {
    
      fields <- callModule(doubleField, "fields")
    
      output$outputTable <- renderDataTable(fields())
    })
    

    doubleField.R

    library(stringr)
    
    doubleFieldUI <- function(id) {
      ns <- NS(id)
    
      return(
        tagList(
          fluidRow(
            column(width = 6, textInput(ns("fieldA"), "Field A")),
            column(width = 6, textInput(ns("fieldB"), "Field B"))
          ),
          fluidRow(
            column(width = 2, "Output: "),
            column(width = 4, textOutput(ns("outputValue")))
          )
        )
      )
    }
    
    is_empty_string <- function(s) {
      return(str_length(s) == 0)
    }
    
    doubleField <- function(input, output, session) {
      valueA <- eventReactive(input$fieldA, {
        if(!is_empty_string(input$fieldA)) {
          ns <- session$ns
          updateTextInput(session, "fieldB", value = "")
          return(input$fieldA)
        }
        return("")
      })
    
      valueB <- eventReactive(input$fieldB, {
        if(!is_empty_string(input$fieldB)) {
          ns <- session$ns
          updateTextInput(session, "fieldA", value = "")
          return(input$fieldB)
        }
        return("")
      })
    
      value <- reactive({
        values <- c(input$fieldA, input$fieldB)
        return(values[which(!is_empty_string(values))])
      })
    
      output$outputValue <- renderText({
        value()
      })
    
      result_df <- reactive({
        v_A <- valueA()
        v_B <- valueB()
        df <- data.frame(
          list(
            "valueA" = ifelse(is_empty_string(v_A), NULL, v_A), 
            "valueB" = ifelse(is_empty_string(v_B), NULL, v_B)
          )
        )
        return(df)
      })
    
      return(result_df);
    }
    

    我希望这有助于您入门。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多