防止在R Shiny中改变要绘制的变量时,重新设置绘图轨迹。

问题描述 投票:0回答:1

我试图制作一个闪亮的应用程序,它由一个侧栏面板和一个情节组成。在面板上,我有单选按钮来选择应该绘制的ID。我也有多个变量,用户可以使用plotly图例来关闭和打开。

我希望当应用程序第一次打开时,情节是空的。为此,我使用了 visible = "legendonly" 在我的plotly中。但是,当ID在侧边栏面板中改变时,我想保留用户已经激活的痕迹(通过在图例中点击它们);但是,由于plotly每次都会重新生成,所以它又使用了 visible = "legendonly" 选项,这就会导致绘图重置。

当在侧边栏面板中选择不同的选项时,有什么方法可以保留痕迹(只保留已经选择的痕迹)?

请看下面一个可重复的例子;请注意,我做的这个例子是在本地运行的。你需要将数据和包分别加载到你的R会话中。数据可以在问题底部找到。

library(shiny)
library(plotly)
library(lubridate)

### Read mdata into your R session
# UI 

uix <- shinyUI(pageWithSidebar(
  headerPanel("Data"),
  sidebarPanel(
    radioButtons('vars', 'ID', 
                 c("1", "2")),
    helpText('Select an ID.')
  ),
  mainPanel(
    h4("Plot"),
    plotlyOutput("myPlot")
  )
)
)
# SERVER 

serverx <- function(input, output) {
 
  #load("Data/mdata.RData") #comment out this part and load data locally
  
  # a large table, reative to input$show_vars
  output$uteTable = renderDataTable({
    ute[, input$show_vars, drop = FALSE]
  })
  
  output$myPlot = renderPlotly(
    {
      p <- plot_ly() %>% 
        layout(title = "Title", xaxis = list(tickformat = "%b %Y", title = "Date"),
               yaxis = list(title = "Y"))
      
      ## Add the IDs selected in input$vars
      for (item in input$vars) {
        mdata %>% 
          mutate(Date = make_date(Year, Month, 15)) %>% 
          filter(ID == item) -> foo
        
        p <- add_lines(p, data = foo, x = ~Date, y = ~Value, color = ~Variable, visible = "legendonly",
                       evaluate = TRUE)
        
        p <- p %>% layout(showlegend = TRUE,
                          legend = list(orientation = "v",   # show entries horizontally
                                        xanchor = "center",  # use center of legend as anchor
                                        x = 100, y=1))        
      }
      print(p)
    })
}
shinyApp(uix, serverx)

创建于2020-06-12,由 重读包 (v0.3.0)

问题:是否可以保留 Var1 痕迹时,改用 ID == 2?

我有个想法 我想如果我可以改变一下... visible = 'legendonlyTRUE 所以它只适用于第一个例子的情节。也许,我需要修改 evaluateFALSE 以及。

数据。

mdata <- structure(list(Year = c(2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
2015L, 2015L, 2015L, 2015L, 2015L, 2015L), Month = c(1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 
5L, 5L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 9L, 9L, 
9L, 9L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 
12L), Variable = c("Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
"Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
"Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
"Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
"Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
"Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
"Var2", "Var2"), ID = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 
2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 
1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2), Value = c(187.797761979167, 
6.34656438541666, 202.288468333333, 9.2249309375, 130.620451458333, 
4.61060465625, 169.033213020833, 7.5226940625, 290.015582677083, 
10.8697671666667, 178.527960520833, 7.6340359375, 234.53493728125, 
8.32400878125, 173.827054583333, 7.54521947916667, 164.359205635417, 
5.55496292708333, 151.75458625, 6.361610625, 190.124467760417, 
6.45046077083333, 191.377006770833, 8.04720916666667, 170.714612604167, 
5.98860073958333, 210.827157916667, 9.46311385416667, 145.784868927083, 
5.16647911458333, 159.9545675, 6.7466725, 147.442681895833, 5.43921594791667, 
153.057018958333, 6.39029208333333, 165.6476956875, 5.63139815625, 
197.179256875, 8.73210604166667, 148.1879651875, 5.58784840625, 
176.859451354167, 7.65670020833333, 186.215496677083, 7.12404453125, 
219.104379791667, 9.39468864583333)), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -48L), groups = structure(list(
    Year = 2015L, .rows = list(1:48)), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE))
r shiny plotly r-plotly shinyapps
1个回答
2
投票

以下使用 plotlyProxy 来替换现有的 plotly 对象(和轨迹)的数据,因此避免了重新渲染绘图。这种方法比重新渲染更快。

library(shiny)
library(plotly)
library(lubridate)

### Read mdata into your R session
mdata <- structure(list(Year = c(2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
                                 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
                                 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
                                 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
                                 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
                                 2015L, 2015L, 2015L, 2015L, 2015L, 2015L), Month = c(1L, 1L, 
                                                                                      1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 
                                                                                      5L, 5L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 9L, 9L, 
                                                                                      9L, 9L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 
                                                                                      12L), Variable = c("Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
                                                                                                         "Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
                                                                                                         "Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
                                                                                                         "Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
                                                                                                         "Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
                                                                                                         "Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1", "Var1", 
                                                                                                         "Var2", "Var2"), ID = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 
                                                                                                                                 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 
                                                                                                                                 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2), Value = c(187.797761979167, 
                                                                                                                                                                                      6.34656438541666, 202.288468333333, 9.2249309375, 130.620451458333, 
                                                                                                                                                                                      4.61060465625, 169.033213020833, 7.5226940625, 290.015582677083, 
                                                                                                                                                                                      10.8697671666667, 178.527960520833, 7.6340359375, 234.53493728125, 
                                                                                                                                                                                      8.32400878125, 173.827054583333, 7.54521947916667, 164.359205635417, 
                                                                                                                                                                                      5.55496292708333, 151.75458625, 6.361610625, 190.124467760417, 
                                                                                                                                                                                      6.45046077083333, 191.377006770833, 8.04720916666667, 170.714612604167, 
                                                                                                                                                                                      5.98860073958333, 210.827157916667, 9.46311385416667, 145.784868927083, 
                                                                                                                                                                                      5.16647911458333, 159.9545675, 6.7466725, 147.442681895833, 5.43921594791667, 
                                                                                                                                                                                      153.057018958333, 6.39029208333333, 165.6476956875, 5.63139815625, 
                                                                                                                                                                                      197.179256875, 8.73210604166667, 148.1879651875, 5.58784840625, 
                                                                                                                                                                                      176.859451354167, 7.65670020833333, 186.215496677083, 7.12404453125, 
                                                                                                                                                                                      219.104379791667, 9.39468864583333)), class = c("grouped_df", 
                                                                                                                                                                                                                                      "tbl_df", "tbl", "data.frame"), row.names = c(NA, -48L), groups = structure(list(
                                                                                                                                                                                                                                        Year = 2015L, .rows = list(1:48)), row.names = c(NA, -1L), class = c("tbl_df", 
                                                                                                                                                                                                                                                                                                             "tbl", "data.frame"), .drop = TRUE))

# UI
uix <- shinyUI(pageWithSidebar(
  headerPanel("Data"),
  sidebarPanel(
    radioButtons('myID', 'ID', 
                 c("1", "2")),
    helpText('Select an ID.')
  ),
  mainPanel(
    h4("Plot"),
    plotlyOutput("myPlot")
  )
)
)

# SERVER
serverx <- function(input, output, session) {

  output$myPlot = renderPlotly({
    p <- plot_ly() %>% 
      layout(title = "Title", xaxis = list(tickformat = "%b %Y", title = "Date"),
             yaxis = list(title = "Y"))

    mdata %>% 
      mutate(Date = make_date(Year, Month, 15)) %>% 
      filter(ID == 1) -> IDData

    p <- add_lines(p, data = IDData, x = ~Date, y = ~Value, color = ~Variable, visible = "legendonly")

    p <- p %>% layout(showlegend = TRUE,
                      legend = list(orientation = "v",   # show entries horizontally
                                    xanchor = "center",  # use center of legend as anchor
                                    x = 100, y=1))        
    p
  })


  myPlotProxy <- plotlyProxy("myPlot", session)

  observe({
    mdata %>%
      mutate(Date = make_date(Year, Month, 15)) %>%
      filter(ID == input$myID) -> IDData

    req(IDData)
    uniqueVars <- unique(IDData$Variable)

    for(i in seq_along(uniqueVars)){
      IDData %>% filter(Variable == uniqueVars[i]) -> VarData
      plotlyProxyInvoke(myPlotProxy, "restyle", list(x = list(VarData$Date), y = list(VarData$Value)), list(i-1))
    }
  })

}

shinyApp(uix, serverx)

result

更多信息,请参见《图集》中的 "17.3.1 部分图集更新 "一章。丛书,普罗利的 函数引用本回答.


1
投票

我能想到的是添加一个复选框来选择要绘制的变量,而不是在图例中关闭和打开它们。使用这种方法,不需要使用 visible = legendonly我把复选框留在没有选择默认值的地方。另外,当用户改变ID时,变量保持不变,因此会被绘制到下一个ID上。请看下面。

library(shiny)
library(plotly)
library(lubridate)

### Read mdata into your R session
# UI 

uix <- shinyUI(pageWithSidebar(
  headerPanel("Data"),
  sidebarPanel(
    radioButtons('vars', 'ID', 
                 c("1", "2")),
    checkboxGroupInput('varp', 'Variable',
                       c("Var1", "Var2")),
    helpText('Select an ID and Variables to be plotted.')
  ),
  mainPanel(
    h4("Plot"),
    plotlyOutput("myPlot")
  )
)
)
# SERVER 

serverx <- function(input, output) {

  #load("Data/mdata.RData") #comment out this part and load data locally

  # a large table, reative to input$show_vars
  output$uteTable = renderDataTable({
    ute[, input$show_vars, drop = FALSE]
  })

  output$myPlot = renderPlotly(
    {
      p <- plot_ly() %>% 
        layout(title = "Title", xaxis = list(tickformat = "%b %Y", title = "Date"),
               yaxis = list(title = "Y"))

      ## Add the IDs selected in input$vars
      for (item in input$vars) {
        mdata %>% 
          mutate(Date = make_date(Year, Month, 15)) %>% 
          filter(ID == item,
                 Variable %in% input$varp)-> foo

        p <- add_lines(p, data = foo, x = ~Date, y = ~Value, color = ~Variable, evaluate = TRUE)

        p <- p %>% layout(showlegend = TRUE,
                          legend = list(orientation = "v",   # show entries horizontally
                                        xanchor = "center",  # use center of legend as anchor
                                        x = 100, y=1))        
      }
      print(p)
    })
}
shinyApp(uix, serverx)

© www.soinside.com 2019 - 2024. All rights reserved.