我是ShinyApp的新手。
我想使用带有conditionalPanel的checkboxInput(),所以当它被选中时,会显示Type的选项(然后用户可以从“BEER”,“REFRESHMENT”,“SPIRITS”,“WINE”中选择一个Type) 。如果未选中,则不会显示“类型”选项。
下面是我的代码,但是当Type选项没有显示时,无论我是否选中该框。我想我应该在服务器功能中写一些东西?我真的不知道。谢谢你的帮助。
ui <- fluidPage(
titlePanel("BC Liquor Store prices"),
img(src = "BCLS.png",align = "right"),
sidebarLayout(
sidebarPanel(sliderInput("priceInput", "Price", 0, 100, c(25, 40), pre = "$"),
wellPanel(
checkboxInput("checkbox", "Filter by Type", FALSE),
conditionalPanel(
condition="checkbox==true",
selectInput("typeInput", "Product type",
choices = c("BEER", "REFRESHMENT", "SPIRITS", "WINE"),
selected = "WINE")
)
),
uiOutput("countryOutput")
),
mainPanel(
tabsetPanel(
tabPanel("Plot", plotOutput("coolplot")),
tabPanel("Summary", verbatimTextOutput("summary")),
tabPanel("Table", tableOutput("results"))
)
)
)
)
server <- function(input, output, session) {
output$countryOutput <- renderUI({
selectInput("countryInput", "Country",
sort(unique(bcl$Country)),
selected = "CANADA")
})
filtered <- reactive({
if (is.null(input$countryInput)) {
return(NULL)
}
bcl %>%
filter(Price >= input$priceInput[1],
Price <= input$priceInput[2],
Type == input$typeInput,
Country == input$countryInput
)
})
output$coolplot <- renderPlot({
if (is.null(filtered())) {
return()
}
filtered() %>% ggvis(~Alcohol_Content, fill := "#fff8dc") %>%
layer_histograms(width = 1, center = 0)
})
output$results <- renderTable({
filtered()
})
}
答案 0 :(得分:5)
好的,您可以将条件输入分为两类。
1)依赖于ui.R的输入(在您的情况下为checkboxInput)
2)依赖于server.R的输入(在您的示例中不必要)
解决方案:
1)您可以使用renderUI()函数轻松解决,请参阅下面的示例。
如果你真的想要2),你需要一个conditionalPanel,你可以在server.R中使用一个被动函数,你保存在一个输出对象中,并用ui.R中的小JS片段访问它。对我来说,它看起来像1)对你来说已经足够了,如果我弄错了,请让我知道然后我们调整答案来解决2)。
提示:
默认情况下,“checkbox”输入采用布尔值:false。所以你不会渲染“typeInput”(直到你点击“复选框”)。所以直到那一点“typeInput”为空。
但是,如果你现在依赖“typeInput”闪亮会被混淆,
因为“typeInput”未呈现,因此不存在。
所以在使用“typeInput”之前,你应该检查它是否可用:
if(!is.null(input$typeInput))
否则闪亮会抱怨你的应用中实际上没有“typeinput”(再次:至少在你点击“复选框”之前)。
ui <- fluidPage(
titlePanel("BC Liquor Store prices"),
img(src = "BCLS.png",align = "right"),
sidebarLayout(
sidebarPanel(sliderInput("priceInput", "Price", 0, 100, c(25, 40), pre = "$"),
wellPanel(
checkboxInput("checkbox", "Filter by Type", FALSE),
uiOutput("conditionalInput")
),
uiOutput("countryOutput")
),
mainPanel(
tabsetPanel(
tabPanel("Plot", plotOutput("coolplot")),
tabPanel("Summary", verbatimTextOutput("summary")),
tabPanel("Table", tableOutput("results"))
)
)
)
)
server <- function(input, output, session) {
output$countryOutput <- renderUI({
selectInput("countryInput", "Country",
sort(unique(bcl$Country)),
selected = "CANADA")
})
output$conditionalInput <- renderUI({
if(input$checkbox){
selectInput("typeInput", "Product type",
choices = c("BEER", "REFRESHMENT", "SPIRITS", "WINE"),
selected = "WINE")
}
})
filtered <- reactive({
if (is.null(input$countryInput)) {
return(NULL)
}
bcl %>%
filter(Price >= input$priceInput[1],
Price <= input$priceInput[2],
Type == input$typeInput,
Country == input$countryInput
)
})
output$coolplot <- renderPlot({
if (is.null(filtered())) {
return()
}
filtered() %>% ggvis(~Alcohol_Content, fill := "#fff8dc") %>%
layer_histograms(width = 1, center = 0)
})
output$results <- renderTable({
filtered()
})
}
# run the app
shinyApp(ui = ui, server = server)
答案 1 :(得分:2)