对于我正在处理的Shiny应用程序,给定一个数据文件,我需要在应用程序的起始页面上显示一个条形图(我正在使用ggplot2)。因此,当用户运行应用程序并上传文件时,他们会立即看到主面板中的条形图。
应用程序启动后,用户应该能够单击actionButton来引导数据并将错误栏添加到同一个条形图中。我不想添加错误栏,因为我的用户可能对错误栏不感兴趣,并且使用bootstrapping添加错误栏会让他们等待。因此,我必须添加错误栏,只有当他们想要看到它并且愿意等待bootstrapping结束时。
我尝试了很多方法来更新情节但是没有成功。我当然可以使用误差条渲染另一个情节,但这不是我想要做的理想情况。有没有办法更新图表或添加功能?
答案 0 :(得分:2)
我认为您总是必须通过renderPlot
才能更新绘图输出(除非您将绘图保存为图像,并将其加载到您的绘图的顶部,在一个不可见的div中像这样)。您可以做的是保存绘图的图层,分别将其分为2部分,一部分使用条形图,另一部分使用误差条,然后根据需要将误差条分层。
data(iris)
require(shiny)
sepal.length <- sapply(unique(iris$Species),function(s){ iris[which(iris$Species==s),"Sepal.Length"] })
data <- data.frame("mean"=apply(sepal.length,2,mean),"sd"=apply(sepal.length,2,sd),"species"=unique(iris$Species))
server <- shinyServer(function(input, output, session) {
# Save plot in reactive
plot.dat <- reactiveValues(main=NULL, layer1=NULL)
plot.dat$main <- ggplot(data=data,aes(x=species,y=mean,fill=species)) +
geom_bar(stat="identity")
observe({
print("render")
output$plot <- renderPlot({ plot.dat$main + plot.dat$layer1 })
})
observeEvent(input$add_bars,{
# Calculate standard deviation
plot.dat$layer1 <- geom_errorbar(aes(ymin=mean-sd,ymax=mean+sd))
})
})
ui <- shinyUI(fluidPage(
plotOutput("plot"),
actionButton("add_bars","Add error bars")
))
shinyApp(ui = ui, server = server)
答案 1 :(得分:0)
我尝试使用 Plotly 以闪亮的方式执行此操作,但没有如上所示的图层。虽然这可能是一个旧线程,但它可能对其他人有帮助。
在下面的例子中:
library(shiny)
library(plotly)
ui <- fluidPage(
selectizeInput(
inputId = "Player",
selected = NULL,
multiple = TRUE,
label = " Choose Player",
choices = c("Sam", "Bennet", "Orlando"),
options = list('plugins' = list('remove_button'))
),
plotlyOutput("Plot1")
)
server <- function(input, output, session) {
output$Plot1 <- renderPlotly({
scores <- data.frame(Name = c("Sam", "Bennet", "Orlando", "Sam", "Bennet", "Orlando", "Sam", "Bennet", "Orlando" ),
Number= c(47, 35, 40, 49, 32, 31, 51, 49, 44 ),
Year = c("2018","2018","2018", "2017", "2017", "2017", "2016","2016","2016")
)
chris_goals <- data.frame(Name = c("Chris", "Chris", "Chris"),
Number= c(90, 95, 100 ),
Year = c("2018","2017","2016")
)
filteredScores <- reactive({
plot_ly(chris_goals, x = ~Year, y = ~Number, type = 'scatter', mode = 'lines', color = ~Name)%>% layout(showlegend = TRUE) %>%
layout(title = 'Scores') %>%
add_trace(data = scores[scores$Name %in% input$Player, ], x = ~Year, y = ~Number, type = 'scatter', mode = 'lines', color = ~Name)
})
filteredScores()
})
}
shinyApp(ui, server)