2016-08-23 69 views
1

我想知道是否可以通過updateNumericInput將數字輸入的值設置爲等於0,如果沒有單擊複選框。下面是我的代碼是如何設置生成複選框和數字輸入的。由於應用程序的性質,我不得不使用循環創建動態數量的複選框和輸入,因此我非常感謝在保持功能的同時連接兩者的任何幫助。如果複選框未選中,將數字輸入更改爲0

服務器文件:

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這給小部件的上限。然後,限制numericInput最大值控制多個小部件來max_widgets(所以input$sources)和內renderUI小號要求

req(numSliders > 0 & numSliders <= max_widgets) 

(我會使用validateneed來通知件的數量有用戶爲非負,勢必max_widgets但在我閃亮的版本有一個bug和validate像預想的那樣不起作用)

然後,爲在服務器端每個checkboxInput創建觀察家:

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

完美地工作!非常感謝你的幫助! –

相關問題