我观察到actionButton
的一些奇怪行为,特别是当它与绘图有关时。以下是我的例子:
基本上,在我的应用程序中,我有一个actionButton
和2个报告部分,每个部分包含一个独立的图。在初始化时,我将有2个不同的线性图。但是,当用户点击actionButton
时,会生成2个不同的图,并生成随机值。
但奇怪的是,我看到,当用户点击actionButton
时,屏幕上只显示一个图表。但是,在初始化时,两个图都会显示出来。
任何解释导致这种奇怪行为的原因是什么?
我的ShinyApp:
library(shiny)
ui = shinyUI(pageWithSidebar(
headerPanel("actionButton test"),
sidebarPanel(
fluidRow(column(6, offset = 3, actionButton("Run", label = "Run")))
),
mainPanel(
fluidRow(column(12, style = "background-color:White;", plotOutput("Chart1", height = '475px'))),
fluidRow(column(12, style = "background-color:White;", plotOutput("Chart2", height = '475px')))
)
))
server = function(input, output) {
Values = reactiveValues(default = 0)
observeEvent(input$Run, {
Values$default = input$Run
})
Plot = eventReactive(input$Run, {
Plot1 = plot(rnorm(100))
Plot2 = plot(rnorm(100))
return(list('Plot1' = Plot1, 'PLot2' = Plot2))
})
output$Chart1 = renderPlot({
if (Values$default == 0) {
plot(1:100)
} else {
Plot()$Plot1
}
})
output$Chart2 = renderPlot({
if (Values$default == 0) {
plot(200:100)
} else {
Plot()$Plot2
}
})
}
runApp(shinyApp(ui = ui, server = server))
答案 0 :(得分:0)
为什么不简单地使用:
server = function(input, output) {
output$Chart1 = renderPlot({
if (input$Run == 0) {
plot(1:100)
} else {
plot(rnorm(100))
}
})
output$Chart2 = renderPlot({
if (input$Run == 0) {
plot(200:100)
} else {
plot(rnorm(100))
}
})
}
runApp(shinyApp(ui = ui, server = server))
我不确定为什么(虽然它似乎与plot
相关)但它不起作用,但您的代码适用于ggplot2:
server = function(input, output) {
Values = reactiveValues(default = 0)
observeEvent(input$Run, {
Values$default = input$Run
})
Plot = eventReactive(input$Run, {
df <- data.frame(x = 1:100, y = rnorm(100))
df2 <- data.frame(x = 1:100, y = rnorm(100))
Plot1 = ggplot(data =df, aes(x= x, y=y)) + geom_point() + theme_bw()
Plot2 = ggplot(data =df2, aes(x= x, y=y)) + geom_point() + theme_bw()
return(list('Plot1' = Plot1, 'Plot2' = Plot2))
})
output$Chart1 = renderPlot({
if (Values$default == 0) {
plot(1:100)
} else {
print(Plot()$Plot1)
}
})
output$Chart2 = renderPlot({
if (Values$default == 0) {
plot(200:100)
} else {
print(Plot()$Plot2)
}
})
}
runApp(shinyApp(ui = ui, server = server))