在r中更新绘图输出

在r中更新绘图输出,r,plot,shiny,R,Plot,Shiny,对于我正在开发的闪亮应用程序,给定一个数据文件,我需要在应用程序的起始页上显示一个条形图(我正在使用ggplot2)。因此,当用户运行应用程序并上传文件时,他们会立即在主面板中看到条形图 应用程序启动后,用户应该能够单击actionButton来引导数据,并将错误条添加到同一条形图中。我不想一开始就添加错误条,因为我的用户可能对错误条不感兴趣,而使用引导添加错误条会让他们等待。所以,我必须添加错误条,只有当他们想看到它,并愿意等待引导结束 我尝试了很多方法来更新情节,但都没有成功。我当然可以用错

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

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


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

我认为您必须始终通过
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)  
数据(iris)
需要(有光泽)

sepal.length我试着在shiny中使用绘图方式进行此操作,但没有如上所示的层。虽然这可能是一条老线索,但它可能对其他人有所帮助

在以下示例中:

  • 首先,根据一个人的分数显示一个图
  • 然后,当我们从列表中选择输入时,其他人的其他分数将更新到同一个图上
库(闪亮)
图书馆(绘本)

用户界面请提供一个可复制的例子,以便我们可以在此基础上进行构建。感谢您对这个问题的兴趣。其他人的回答解决了我的问题。:)谢谢这就是我想做的,把情节分成两部分,但我不知道如何在一个闪亮的背景下正确地进行。嗨,再次,虽然你的答案有帮助,但我仍然没有弄明白一些事情。在使用它们之前,您在全局环境中定义了均值和标准差。但是,我需要在观察到事件
input$add_bars
后计算sd,然后将其附加到
数据
,然后再使用它添加带有错误条的层。我没有成功地做到这一点。你能帮我吗?非常感谢!事实上,我终于明白了。我在event observer中定义了一个新的数据帧,它具有均值和sdev值,并更新了observer中的两个层,而不是仅更新带有错误条的层。虽然这样做有效,但我想知道当用户更改他们输入的数据文件时是否会遇到问题。在任何情况下,输入一个新文件后,来自上一个数据集的带有错误条的图层将保持不变,从而导致新数据文件的错误条不正确。这比我想象的要复杂。你可以做的是在读取新数据时将
plot.dat$layer1
设置为空。根据您的代码,更改datset migt或migt可能不会导致错误。如果你能给我举个例子,我很乐意看一看。我考虑过了。但问题是如何检测新的文件输入。我的文件输入的工作方式与此演示中的相同:。
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)