1

私の光沢のあるアプリはcheckboxGroupInput、3 つの会社の名前を含む で始まります: ABおよびC。またhidden、それぞれが会社に対応する 3 つの数値入力もあります。潜在的な投資家は、投資したい会社の名前を選択し、投資したい金額を指定することができます。会社名をチェックすると、対応する数値入力が表示されます。また、会社名のチェックを外すと数値入力が消えます。

checkboxGroupInput呼ばれcompanyます。3 つのnumericInputフィールドはそれぞれamountA、 、amountBと呼ばれ、amountCすべて 内で生成されますuiOutput。それらは のhidden機能で隠されていますshinyjs

library(shiny)
library(shinyjs)
library(magrittr)

ui <- fluidPage(

  useShinyjs(),

  checkboxGroupInput(inputId = "company", label = "Select a company", choices = LETTERS[1:3]),

  uiOutput(outputId = "amounts")

)

server <- function(input, output){

  company_names <- LETTERS[1:3]
  num_ids <- paste0("amount", LETTERS[1:3])

  output$amounts <- renderUI({

    num_inputs <- lapply(1:3, function(i){
      numericInput(inputId = num_ids[i], label = paste0("Investment in ", company_names[i]), value = 0, min = 0, max = 5000)
    }) %>% tagList

    shinyjs::hidden(num_inputs)

  })

  observeEvent(eventExpr = input$company, handlerExpr = {

    if(length(input$company) == 0){
      for(i in num_ids){
        shinyjs::hide(id = i)
      }
    } else {
      for(i in input$company){
        shinyjs::toggle(id = paste0("amount", i), condition = input$company)
      }
    }
  })

}

shinyApp(ui = ui, server = server)

私のアプリの問題はcheckboxGroupInput、フィールドとnumericInputフィールドの間の意図したダイナミクスが意図したとおりに機能しないことです。たとえば、numericInputが表示されると、ボックスのチェックを外して非表示にすることはできません。どうすればこれを処理できますか?

上に貼り付けたコードは完全に機能します。どうもありがとうございました。

4

1 に答える 1

1

numericInput対応するチェックボックスが選択されている/選択されていないときに明示的に表示/非表示にすることで、コードを修正しました。また、チェック ボックスがどれも選択されていないときにオブザーバーが反応するように、 observeEventwithを変更します。observe

library(shiny)
library(shinyjs)
library(magrittr)

ui <- fluidPage(
  useShinyjs(),
  checkboxGroupInput(inputId = "company", label = "Select a company", choices = LETTERS[1:3]),
  uiOutput(outputId = "amounts")
)

server <- function(input, output){
  company_names <- LETTERS[1:3]
  num_ids <- paste0("amount", LETTERS[1:3])

  output$amounts <- renderUI({

    num_inputs <- lapply(1:3, function(i){
      numericInput(inputId = num_ids[i], label = paste0("Investment in ", company_names[i]), value = 0, min = 0, max = 5000)
    }) %>% tagList

    shinyjs::hidden(num_inputs)
  })

  observe({
    for(i in company_names){
      if (i %in% input$company) {
        shinyjs::show(id = paste0("amount", i))
      } else {
        shinyjs::hide(id = paste0("amount", i))
      }  
    }
  })

}

shinyApp(ui = ui, server = server)
于 2016-11-17T06:28:48.780 に答える