根据条件显示图表
Show a chart based on a condition
我有以下代码,您可以在其中输入一个字符串,单击一个按钮并根据输入的字符串获得结果:
# ui.R
ui <- fluidPage(
conditionalPanel(
"input.btn_input === 0",
textInput("caption", "Caption", "abc"),
actionButton("btn_input", "Enter")
),
conditionalPanel(
"input.btn_input !== 0",
style = "display: none;",
verbatimTextOutput("value")
)
)
# server.R
server <- function(input, output) {
Response <- eventReactive(input$btn_input, {
v <- input$caption
if (v == "xxx") {
# Allow to use the chart
} else {
"Error"
}
})
output$value <- renderPrint({
Response()
})
}
现在,我想插入 Shiny 示例中包含的图表,而不是 # Allow to use the chart
,即:
ui <- fluidPage(
titlePanel("Old Faithful Geyser Data"),
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30)
),
mainPanel(
plotOutput("distPlot")
)
)
)
server <- function(input, output) {
output$distPlot <- renderPlot({
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})
}
shinyApp(ui = ui, server = server)
谁能建议我怎么做?我能做的最好的事情就是显示侧边栏面板。提前致谢。
我们可以使用 shinyjs
包来根据条件显示和隐藏元素。
例如,我们可以用div
包裹sidebarLayout
,给它一个唯一的id参数。这是一个示例代码:
library(shiny)
library(shinyjs)
ui <- fluidPage(
titlePanel("Old Faithful Geyser Data"),
#initialize shinyjs
shinyjs::useShinyjs(),
textInput("caption", "Caption", "abc"),
hidden(verbatimTextOutput("value")),
shinyjs::hidden(div(
id = "sidebar_part",
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30
)
),
mainPanel(
plotOutput("distPlot")
)
)
))
)
server <- function(input, output) {
# condition to show the sidebarLayout
observeEvent(input$caption,
{
if (input$caption == "xxx") {
shinyjs::hide("caption")
shinyjs::show("sidebar_part")
shinyjs::hide("value")
} else {
shinyjs::show("value")
output$value <- renderText({
"error"
})
}
},
ignoreInit = TRUE
)
output$distPlot <- renderPlot({
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
hist(x, breaks = bins, col = "darkgray", border = "white")
})
}
shinyApp(ui = ui, server = server)
编辑:
使用 actionButton
并在提供错误答案时隐藏除错误之外的所有内容。
library(shiny)
library(shinyjs)
ui <- fluidPage(
titlePanel("Old Faithful Geyser Data"),
# initialize shinyjs
shinyjs::useShinyjs(),
div(
id = "caption_and_send",
textInput("caption", "Caption", "abc"),
actionButton("send", "Send")
),
hidden(verbatimTextOutput("value")),
shinyjs::hidden(div(
id = "sidebar_part",
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30
)
),
mainPanel(
plotOutput("distPlot")
)
)
))
)
server <- function(input, output) {
# condition to show the sidebarLayout
observeEvent(input$send,
{
if (input$caption == "xxx") {
shinyjs::hide("caption_and_send")
shinyjs::show("sidebar_part")
} else {
shinyjs::hide("caption_and_send")
shinyjs::show("value")
output$value <- renderText({
"error"
})
}
},
ignoreInit = TRUE
)
output$distPlot <- renderPlot({
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
hist(x, breaks = bins, col = "darkgray", border = "white")
})
}
shinyApp(ui = ui, server = server)
我有以下代码,您可以在其中输入一个字符串,单击一个按钮并根据输入的字符串获得结果:
# ui.R
ui <- fluidPage(
conditionalPanel(
"input.btn_input === 0",
textInput("caption", "Caption", "abc"),
actionButton("btn_input", "Enter")
),
conditionalPanel(
"input.btn_input !== 0",
style = "display: none;",
verbatimTextOutput("value")
)
)
# server.R
server <- function(input, output) {
Response <- eventReactive(input$btn_input, {
v <- input$caption
if (v == "xxx") {
# Allow to use the chart
} else {
"Error"
}
})
output$value <- renderPrint({
Response()
})
}
现在,我想插入 Shiny 示例中包含的图表,而不是 # Allow to use the chart
,即:
ui <- fluidPage(
titlePanel("Old Faithful Geyser Data"),
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30)
),
mainPanel(
plotOutput("distPlot")
)
)
)
server <- function(input, output) {
output$distPlot <- renderPlot({
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})
}
shinyApp(ui = ui, server = server)
谁能建议我怎么做?我能做的最好的事情就是显示侧边栏面板。提前致谢。
我们可以使用 shinyjs
包来根据条件显示和隐藏元素。
例如,我们可以用div
包裹sidebarLayout
,给它一个唯一的id参数。这是一个示例代码:
library(shiny)
library(shinyjs)
ui <- fluidPage(
titlePanel("Old Faithful Geyser Data"),
#initialize shinyjs
shinyjs::useShinyjs(),
textInput("caption", "Caption", "abc"),
hidden(verbatimTextOutput("value")),
shinyjs::hidden(div(
id = "sidebar_part",
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30
)
),
mainPanel(
plotOutput("distPlot")
)
)
))
)
server <- function(input, output) {
# condition to show the sidebarLayout
observeEvent(input$caption,
{
if (input$caption == "xxx") {
shinyjs::hide("caption")
shinyjs::show("sidebar_part")
shinyjs::hide("value")
} else {
shinyjs::show("value")
output$value <- renderText({
"error"
})
}
},
ignoreInit = TRUE
)
output$distPlot <- renderPlot({
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
hist(x, breaks = bins, col = "darkgray", border = "white")
})
}
shinyApp(ui = ui, server = server)
编辑:
使用 actionButton
并在提供错误答案时隐藏除错误之外的所有内容。
library(shiny)
library(shinyjs)
ui <- fluidPage(
titlePanel("Old Faithful Geyser Data"),
# initialize shinyjs
shinyjs::useShinyjs(),
div(
id = "caption_and_send",
textInput("caption", "Caption", "abc"),
actionButton("send", "Send")
),
hidden(verbatimTextOutput("value")),
shinyjs::hidden(div(
id = "sidebar_part",
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30
)
),
mainPanel(
plotOutput("distPlot")
)
)
))
)
server <- function(input, output) {
# condition to show the sidebarLayout
observeEvent(input$send,
{
if (input$caption == "xxx") {
shinyjs::hide("caption_and_send")
shinyjs::show("sidebar_part")
} else {
shinyjs::hide("caption_and_send")
shinyjs::show("value")
output$value <- renderText({
"error"
})
}
},
ignoreInit = TRUE
)
output$distPlot <- renderPlot({
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
hist(x, breaks = bins, col = "darkgray", border = "white")
})
}
shinyApp(ui = ui, server = server)