更新闪亮r中的绘图输出

时间:2015-10-23 23:22:43

标签: r plot shiny

对于我正在处理的Shiny应用程序,给定一个数据文件,我需要在应用程序的起始页面上显示一个条形图(我正在使用ggplot2)。因此,当用户运行应用程序并上传文件时,他们会立即看到主面板中的条形图。

应用程序启动后,用户应该能够单击actionButton来引导数据并将错误栏添加到同一个条形图中。我不想添加错误栏,因为我的用户可能对错误栏不感兴趣,并且使用bootstrapping添加错误栏会让他们等待。因此,我必须添加错误栏,只有当他们想要看到它并且愿意等待bootstrapping结束时。

我尝试了很多方法来更新情节但是没有成功。我当然可以使用误差条渲染另一个情节,但这不是我想要做的理想情况。有没有办法更新图表或添加功能?

2 个答案:

答案 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)

默认: enter image description here

enter image description here