Module 如何编写一个有两个文本输入的模块,其中一个输入,另一个输入空白,vv?
我想写一个模块,其中客户端函数返回一个带有2个文本输入的标记列表。用户可以在textInput 1或textInput 2中输入值,但不能同时在两者中输入。换句话说,一个textInput排除另一个,模拟一组单选按钮 因此,服务器函数应以这样的方式观察输入:如果用户在textInput 1中输入值,则textInput 2变为空白,反之亦然。 此外,服务器函数返回一个数据帧,其中包含文本输入中的值,即data.frame(一个=enteredValue,两个=NA)或data.frame(一个=NA,两个=enteredValue) 由于我们计划在许多闪亮的应用程序中使用这两个文本输入小部件,我真的想让它成为一个模块。实施起来似乎很简单,但到目前为止我还没有成功。(我的经验是,观察、观察和事件反应在模块中的工作方式与在常规应用程序中不同)Module 如何编写一个有两个文本输入的模块,其中一个输入,另一个输入空白,vv?,module,shiny,textinput,Module,Shiny,Textinput,我想写一个模块,其中客户端函数返回一个带有2个文本输入的标记列表。用户可以在textInput 1或textInput 2中输入值,但不能同时在两者中输入。换句话说,一个textInput排除另一个,模拟一组单选按钮 因此,服务器函数应以这样的方式观察输入:如果用户在textInput 1中输入值,则textInput 2变为空白,反之亦然。 此外,服务器函数返回一个数据帧,其中包含文本输入中的值,即data.frame(一个=enteredValue,两个=NA)或data.frame(一个=
欢迎任何能为我指明正确方向的想法。我相信,在一个闪亮的模块中,事件反应和观察都是有效的。我创建了一个小模块,它基本上实现了您所描述的功能 用户界面 服务器.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);
}