2016-08-23 13 views
1

チェックボックスがクリックされていない場合、updateNumericInputを介して数値入力の値を0に設定できるかどうかは疑問でした。以下は、現時点でチェックボックスと数値入力を生成するために私のコードがどのように設定されているかです。私はアプリケーションの性質上、動的なチェックボックスと入力を作成するためにループを使用しなければならなかったので、機能を維持しながら2つをリンクする助けに本当に感謝します。チェックボックスがオフの場合数値入力を0に変更

Serverファイル:

shinyServer(function(input, output, session) { 

    output$inputs1 <- renderUI({ 
    numSliders <- input$sources 
    lapply(1:numSliders, function(i) { 
     numericInput(
     inputId = paste0('slider1', i), 
     label = df[i,2], 
     value = df[i,3]*(input$budget)/100) 
    }) 
    }) 

    output$checks1 <- renderUI({ 
    numSliders <- input$sources 
    lapply(1:numSliders, function(i) { 
     checkboxInput(
     inputId = paste0('check1', i), 
     label = df[i,2], 
     value = TRUE 
     ) 
    }) 
    }) 
} 

UI:

shinyUI(fluidPage(fluidRow(
    sidebarLayout(
     sidebarPanel(
     column(5,numericInput("budget", "Budget", value = 0), 
      uiOutput("checks1")), 
     column(5,uiOutput("inputs1"))), 
     mainPanel() 
    ) 
) 
) 
) 

このための回避策の任意の並べ替えがある場合は私に知らせてください。

ありがとうございます!

答えて

0

有限個のウィジェットしか生成できないため、それぞれのcheckboxInputに対してobserverを作成する最も簡単な方法は、ウィジェットの上限を与えるグローバル変数、たとえばmax_widgetsを作成することです。その後、(そうinput$sourcesmax_widgetsへのウィジェットの数を制御numericInputの最大値を制限し、

req(numSliders > 0 & numSliders <= max_widgets) 

は(私はvalidateneedは、ウィジェットの数が持っているユーザーに通知するために使用することrenderUI秒以内に必要そこにバグがあると想定してvalidateが動作しない非負とmax_widgetsに私の光沢のあるバージョンにバインドされていなければ)あなたは、サーバー側で各checkboxInputのためのオブザーバーを作成

:。

012これはすべての可能なチェックボックスのためのオブザーバーを作成することをは
lapply(1:max_widgets, function(i) { 
     observeEvent(input[[paste0('check', i)]], { 
      print(paste0("update of numeric", i)) 
      updateNumericInput(session, inputId = paste0('numeric', i), 
           value = 0) 
     }) 
    }) 

注意(チェックボックスも存在しないかもしれない - 光沢のある:)文句はありません)

これは完璧ではないかもしれないけど、言ったように、あなたが唯一のオブザーバーを持っています各チェックボックスごとに

あなたが動的に(グローバル変数max_widgetsなし)次のようにオブザーバーを生成する場合

observe({ 
    lapply(1:input$sources, function(i) { 
     observeEvent(input[[paste0('check', i)]], { 
      print(paste0("numeric", i, " = ", input[[paste0('numeric', i)]])) 
      updateNumericInput(session, inputId = paste0('numeric', i), 
           value = 0) 
     }) 
    }) 

それはあまりにも動作しますが、あなたが新しいウィジェットを生成しますたびに、あなたはまた、そのためのオブザーバーを作成します。だから、あなたはそれぞれcheckboxInputの複数のオブザーバーを得るかもしれません! あなたのアプリが小さければそれほど重要ではありませんが、一般的にバグにつながる可能性があります。簡単に対処することはできますが、コードが少し複雑になります。questionがこの問題に触れています。




enter image description here


全例:完全に働いた

library(shiny) 
rm(list = ls()) 

max_widgets <- 15 

server <- shinyServer(function(input, output, session) { 

    output$inputs1 <- renderUI({ 

    numSliders <- input$sources 
    # My shiny version has a bug and can't use validate(need(...)) because 
    # it doesn't work as suppossed 
    req(numSliders > 0 & numSliders <= max_widgets) 

    lapply(1:numSliders, function(i) { 
     numericInput(
     inputId = paste0('numeric', i), 
     # label = df[i,2], 
     paste0("Input ", i), 
     # value = df[i,3] * (input$budget)/100) 
     value = i * (input$budget)/100) 
    }) 

    }) 

    output$checks1 <- renderUI({ 

    numSliders <- input$sources 
    req(numSliders > 0 & numSliders <= max_widgets) 

    lapply(1:numSliders, function(i) { 
     list(
     checkboxInput(
      inputId = paste0('check', i), 
      # label = df[i,2], 
      label = paste0("Checkbox ", i), 
      value = TRUE 
     ), 
     br() 
    ) 
    }) 

    }) 

    lapply(1:max_widgets, function(i) { 
     observeEvent(input[[paste0('check', i)]], { 
      print(paste0("update of numeric", i)) 
      updateNumericInput(session, inputId = paste0('numeric', i), 
           value = 0) 
     }) 
    }) 

}) 

ui <- shinyUI(fluidPage(fluidRow(
    sidebarLayout(
    sidebarPanel(
     column(5, 
     numericInput("budget", "Budget", value = 0), 
     hr(), 
     br(), 
     uiOutput("checks1") 
    ), 
     column(5, 
     numericInput("sources", "Sources", value = 0, min = 0, max = max_widgets), 
     hr(), 
     uiOutput("inputs1") 
    ) 
    ), 
    mainPanel() 
) 
))) 
shinyApp(ui, server) 
+1

!あなたの助けをありがとう! –

関連する問題