如何用两个 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 空白?的主要内容,如果未能解决你的问题,请参考以下文章