【问题标题】:updating plot output in shiny r在闪亮的 r 中更新绘图输出
【发布时间】:2015-10-23 23:22:43
【问题描述】:

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

应用程序启动后,用户应该能够单击操作按钮来引导数据并将误差线添加到同一个条形图中。我不想一开始就添加错误栏,因为我的用户可能对错误栏不感兴趣,并且通过引导添加错误栏会让他们等待。所以,只有当他们想看到它并且愿意等待引导结束时,我才必须添加错误栏。

我尝试了很多方法来更新剧情,但都没有成功。我当然可以用误差线绘制另一个图,但这不是我理想的做法。有没有办法更新绘图或向它们添加功能?

【问题讨论】:

  • 请提供可重现的示例,以便我们在此基础上进行构建。
  • 感谢您对这个问题的关注。其他人以解决我问题的方式回答了它。 :)

标签: r plot shiny


【解决方案1】:

我认为您总是必须通过renderPlot 才能更新绘图输出(除非您将绘图保存为图像,并将其加载到不可见 div 或类似的绘图顶部)。您可以做的是将绘图的图层分别保存为两部分,一部分带有条形图,另一部分带有误差线,然后如果需要,只需将误差线分层。

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)  

【讨论】:

  • 谢谢!这就是我想要做的,将情节分成两部分,但我不知道如何在闪亮的环境中正确地做到这一点。
  • 您好,虽然您的回答有帮助,但我仍然无法弄清楚。在使用它们之前,您在全局环境中定义了均值和标准差。但是,我需要在观察到事件 input$add_bars 之后计算 sd,然后将其附加到 data,然后再用于添加带有误差线的图层。我没有成功地做到这一点。你能帮我解决这个问题吗?非常感谢!
  • 其实我终于明白了。我在事件观察者中定义了一个新的数据框,它同时具有平均值和 sdev 值,并更新了观察者中的两个图层,而不是只更新带有误差线的图层。虽然这可行,但我想知道当用户更改他们输入的数据文件时是否会遇到问题。在任何情况下,输入新文件后,先前数据集中带有错误栏的图层仍然会导致新数据文件的错误栏不正确。比我想象的要复杂。
  • 当您读入新数据时,您可以将plot.dat$layer1 设置为 NULL。根据您的代码,更改数据集 migt 或可能不会给您错误。如果你能给我一个例子,我很乐意快速浏览一下。
  • 我想过。但问题是如何检测新的文件输入。我的文件输入就像在这个演示中一样工作:link.
【解决方案2】:

我尝试使用 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)

默认值:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2018-04-30
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多