Module 如何编写一个有两个文本输入的模块,其中一个输入,另一个输入空白,vv?

Module 如何编写一个有两个文本输入的模块,其中一个输入,另一个输入空白,vv?,module,shiny,textinput,Module,Shiny,Textinput,我想写一个模块,其中客户端函数返回一个带有2个文本输入的标记列表。用户可以在textInput 1或textInput 2中输入值,但不能同时在两者中输入。换句话说,一个textInput排除另一个,模拟一组单选按钮 因此,服务器函数应以这样的方式观察输入:如果用户在textInput 1中输入值,则textInput 2变为空白,反之亦然。 此外,服务器函数返回一个数据帧,其中包含文本输入中的值,即data.frame(一个=enteredValue,两个=NA)或data.frame(一个=

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

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

由于我们计划在许多闪亮的应用程序中使用这两个文本输入小部件,我真的想让它成为一个模块。实施起来似乎很简单,但到目前为止我还没有成功。(我的经验是,观察、观察和事件反应在模块中的工作方式与在常规应用程序中不同)


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

我相信,在一个闪亮的模块中,事件反应和观察都是有效的。我创建了一个小模块,它基本上实现了您所描述的功能

用户界面

服务器.R

library(shiny)
source("doubleField.R")

shinyServer(function(input, output) {

  fields <- callModule(doubleField, "fields")

  output$outputTable <- renderDataTable(fields())
})
库(闪亮)
来源(“doubleField.R”)
shinyServer(功能(输入、输出){

fields我相信EventResponsive和observeEvent在一个闪亮的模块中工作。我创建了一个小模块,基本上实现了您所描述的功能

用户界面

服务器.R

library(shiny)
source("doubleField.R")

shinyServer(function(input, output) {

  fields <- callModule(doubleField, "fields")

  output$outputTable <- renderDataTable(fields())
})
库(闪亮)
来源(“doubleField.R”)
shinyServer(功能(输入、输出){
领域
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);
}