2016-03-04 20 views
0

我想寫一個MODULE,其中客戶端函數返回帶有2個textInputs的標籤列表。用戶可以在textInput 1或textInput 2中輸入值,但不能同時輸入值。換句話說,一個textInput排斥另一個,模擬一組單選按鈕。如何編寫一個帶有兩個textInput的MODULE,其中一個輸入爲空,另一個爲vv?

因此,服務器功能應該以這樣的方式觀察輸入,即如果用戶在textInput 1中輸入值,則textInput 2會變爲空白,反之亦然。 此外,服務器函數返回textInputs中的值(即data.frame(one = enteredValue,two = NA)或data.frame(one = NA,two = enteredValue)中的值)

因爲我們是我們計劃在我們的許多閃亮應用中使用這個雙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") 
    ) 
) 
)) 

server.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); 
} 

我希望這有助於讓你開始。

相關問題