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