Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如果未选中复选框,则将数字输入更改为0_R_Shiny_Rstudio - Fatal编程技术网

R 如果未选中复选框,则将数字输入更改为0

R 如果未选中复选框,则将数字输入更改为0,r,shiny,rstudio,R,Shiny,Rstudio,我想知道如果没有单击复选框,是否可以通过updateNumericInput将数字输入的值设置为等于0。下面是如何设置我的代码来生成复选框和数字输入。由于应用程序的性质,我不得不使用循环来创建动态数量的复选框和输入,因此我非常感谢在保持功能的同时将两者联系起来的任何帮助 服务器文件: shinyServer(function(input, output, session) { output$inputs1 <- renderUI({ numSliders <- in

我想知道如果没有单击复选框,是否可以通过updateNumericInput将数字输入的值设置为等于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
        )
    })
  })
}
请告诉我是否有任何解决方法


提前谢谢

由于您只能生成有限数量的小部件,因此为每个
checkboxInput
创建
observer
的最简单方法是创建一个全局变量,例如,
max\u widgets
,它给出了小部件的上限。然后,您将
numericInput
的最大值限制为
max\u widgets
(因此
input$sources
),并在
renderUI
中要求

req(numSliders > 0 & numSliders <= max_widgets)
注意,这将为所有可能的复选框创建观察者(复选框可能根本不存在-shiny不会抱怨:)

这可能并不完美,但正如前面所说,每个复选框只有一个观察者

如果以以下方式动态生成观察者(无全局变量
max\u widgets

它也会工作,但每次你将生成新的小部件,你也将为它创建一个观察者。因此,对于每个
checkboxInput
,您可能会得到多个观察者! 如果你的应用程序很小,那么这无关紧要,但一般来说,它可能会导致错误。您可以轻松地处理它,但这会使代码稍微复杂一点-有一个例子涉及到这个问题





完整示例:

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)
库(闪亮)
rm(list=ls())

max_widgets由于您只能生成有限数量的widgets,因此为每个
checkboxInput
创建
观察者的最简单方法是创建一个全局变量,例如,
max_widgets
,它给出了widgets的上限。然后,您将
numericInput
的最大值限制为
max\u widgets
(因此
input$sources
),并在
renderUI
中要求

req(numSliders > 0 & numSliders <= max_widgets)
注意,这将为所有可能的复选框创建观察者(复选框可能根本不存在-shiny不会抱怨:)

这可能并不完美,但正如前面所说,每个复选框只有一个观察者

如果以以下方式动态生成观察者(无全局变量
max\u widgets

它也会工作,但每次你将生成新的小部件,你也将为它创建一个观察者。因此,对于每个
checkboxInput
,您可能会得到多个观察者! 如果你的应用程序很小,那么这无关紧要,但一般来说,它可能会导致错误。您可以轻松地处理它,但这会使代码稍微复杂一点-有一个例子涉及到这个问题





完整示例:

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)
库(闪亮)
rm(list=ls())

max_小部件工作得很好!非常感谢你的帮助!工作得很好!非常感谢你的帮助!
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)