如何用两个 textInputs 编写 MODULE,其中一个输入,另一个和 vv 空白?

Posted

技术标签:

【中文标题】如何用两个 textInputs 编写 MODULE,其中一个输入,另一个和 vv 空白?【英文标题】:How to write a MODULE with two textInputs, in which input in one, blanks out the other and 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 在模块中的工作方式与在常规应用程序中不同)

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

【问题讨论】:

【参考方案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);

我希望这有助于您入门。

【讨论】:

以上是关于如何用两个 textInputs 编写 MODULE,其中一个输入,另一个和 vv 空白?的主要内容,如果未能解决你的问题,请参考以下文章

如何用JAVA编写计算器?

如何用C语言编写一个求两数相加得和的小程序。

如何用JavaScript编写一个天猫上使用的倒计时?

如何用两个不同的期望值断言一个实际值

如何用python编辑 一个偶数总能表示为两个素数之和

如何用VC编写一个程序,运行打开指定网页