Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
shin R中的被动数据帧和更新输入问题_R_Shiny_Bar Chart_Reactive_R Highcharter - Fatal编程技术网

shin R中的被动数据帧和更新输入问题

shin R中的被动数据帧和更新输入问题,r,shiny,bar-chart,reactive,r-highcharter,R,Shiny,Bar Chart,Reactive,R Highcharter,我仍然是使用shiny的初学者(下面的代码将清楚地演示这一事实)。在我正在做的这个例子中,我必须生成两个条形图。这两个图都是从一组数据框中衍生出来的,每个数据框都与不同的年份相关。在每个数据帧中都有一些行(示例中为8行),每个行与一个值(例如,“值1”、“值2”等)关联。用户选择年份范围(start\u year和end\u year),服务器计算两年之间每个值的差值(例如,2018年的“值1”减去2015年的“值1”)。但是,在第一个条形图中仅显示有限数量的值,在本例中为4。到目前为止,我还没

我仍然是使用shiny的初学者(下面的代码将清楚地演示这一事实)。在我正在做的这个例子中,我必须生成两个条形图。这两个图都是从一组数据框中衍生出来的,每个数据框都与不同的年份相关。在每个数据帧中都有一些行(示例中为8行),每个行与一个值(例如,“值1”、“值2”等)关联。用户选择年份范围(
start\u year
end\u year
),服务器计算两年之间每个值的差值(例如,2018年的“值1”减去2015年的“值1”)。但是,在第一个条形图中仅显示有限数量的值,在本例中为4。到目前为止,我还没有遇到任何问题。但是,我必须显示另一个条形图,链接到示例中的输入
val\u select
。我必须为该输入添加第一个条形图中显示的前四个值作为选项。此外,用户可以从该短值列表中进行选择,并且在第二个条形图中,将显示所选年份期间内每年所选值的趋势。例如,如果在2005-2018年期间,显示的四个值是,例如,“值2”、“值4”、“值6”、“值7”,则可以在第三个输入中从这四个值中进行选择,所选值将显示在第二个条形图中,其值介于2005年和2018年之间。 我在脚本中有两个主要问题:

  • 尝试用
    updateSelectInput
    更新第三个输入
    val_select
    中的选项列表会压碎应用程序
  • 第二个条形图不会生成并返回以下错误:
  • 下面是我在线程结束时编写的示例,试图获得所需的输出

    library(shiny)
    library(shinydashboard)
    library(highcharter)
    library(dplyr)
    
    # Generate data
    years = c(2009:2019)
    
    list_db = vector("list")
    var = c("Value 1", "Value 2", "Value 3", "Value 4", "Value 5", "Value 6", "Value 7", "Value 8")
    
    for (i in 1:length(years)){
        x = runif(8, min = 0, max = 100)
        df = data.frame(var, x)
        list_db[[i]] = df
    }
    names(list_db) = years
    
    # UI
    ui <- dashboardPage(
        dashboardHeader(),
        dashboardSidebar(
            sidebarMenu(
                menuItem("Page 1", tabName = 'tab_page_1'),
                selectInput(inputId = "start_year",
                            label = "Select starting year:",
                            choices = min(years):max(years)),
                selectInput(inputId = "end_year",
                            label = "Select ending year:",
                            choices = min(years):max(years)),
                selectInput(inputId = "val_select",
                            label = "Select Value (within the selected range) to show:",
                            choices = var)
            )
        ),
        dashboardBody(
            tabItem(tabName = 'tab_page_1'),
            fluidPage(
                titlePanel("Example Page 1")
            ),
            fluidPage(
                fluidRow(
                    box(title = "Barplot n.1",
                        solidHeader = TRUE, 
                        status = 'primary',
                        highchartOutput("tab_1", height = 500)
                    ),
                    box(title = "Barplot n.2 (Value focus)",
                        solidHeader = TRUE, 
                        status = 'primary',
                        highchartOutput("tab_2", height = 500)
                    ),
                    
                )
            )
        )
    )
    
    # Server
    server <- function(input, output, session) {
        
        # Update 'end_year' based on 'start_year' input
        
        observeEvent(input$start_year, {
            updateSelectInput(session, 'end_year',
                              choices = (as.integer(input$start_year)+1):max(years)
            )
        })
        
        # Reactive data frame
        
        react_data = reactive({
            
            # Generate starting and ending data frame
            assign("data_start", list_db[[as.character(input$start_year)]])
            assign("data_end", list_db[[as.character(input$end_year)]])
            
            # Add the selected year to variables' names
            data_start = data_start %>% rename_at(vars(-var), ~ paste0(., "_", input$start_year))
            data_end = data_end %>% rename_at(vars(-var), ~ paste0(., "_", input$end_year))
            
            # Join starting and ending data frame
            dt = full_join(data_start, data_end, by = "var")
            
            # Calculate vars' differences between the selected years
            dt$x_diff = dt[,paste0("x_",input$end_year)] - dt[,paste0("x_",input$start_year)] 
            
            # Select only first 4 Values
            dt = head(dt[order(dt$x_diff),],4)
            
        })
    
        # Update 'val_select' b <--- Problematic
        
        observeEvent({
            val_select_data = react_data()
            mylist = val_select_data$var
            updateSelectInput(session, 'val_select',
                              choices = mylist
            )
        })
        
        # Output 'tab_1' <--- This works
        
        output$tab_1 = renderHighchart({ 
            
            # Select data frame
            mydata1 = react_data()
            
            # Plot
            highchart() %>% 
                hc_chart(type = "bar") %>%
                hc_xAxis(categories = mydata1$var)  %>%
                hc_series(list(name = "Variables", 
                               pointWidth = 50, 
                               data = mydata1$x_diff, 
                               color = "rgba(162, 52, 52, 0.5)")) %>%
                hc_xAxis(labels = list(style = list(fontSize = "12"))) %>%
                hc_chart(plotBackgroundColor = "#EEEEEE") %>%
                hc_legend(enabled = FALSE)
        })
        
        # Output 'tab_2' <--- Problematic
        
        output$tab_2 = renderHighchart({ 
            
            # Select data frame
            mydata2 = react_data()
            
            # List of first 4 Value in the selected year range
            first_values = mydata2$var
            
            # List of years in the selected year range
            years = sort(c(min(input$start_year):max(input$end_year)))
            
            # Create a list to contain data frame for each year (inside the selected range)
            data_year = vector("list", length(years))
            
            for (i in as.character(years)){
                
                assign("df", list_db[[i]])
                
                # Consider only Value in 'first_values'
                df = df[df$var %in% first_values,]
                
                # Insert into the list
                data_year[[i]] = df
                
            }
            # Remove empty elements from the list
            data_year = data_year[!sapply(data_year,is.null)]
            
            # Generate a yearly data frame for each Value
            data_values = vector("list", length(first_values))
            years_lead = years[-1]
            
            for (row in 1:length(data_values)){
                
                df = data_year[[as.character(years[1])]][row, c(1:length(data_year[[as.character(years[1])]]))]
                
                for (i in years_lead){
                    df = rbind(df, data_year[[as.character(i)]][row, c(1:length(data_year[[as.character(i)]]))])
                }
                
                df = cbind(years, df)
                data_values[[row]] = df
                
            }
            
            # Assign names to the list
            names(data_values) = paste(first_values)
            
            # Select the dataframe based on the selected profession
            assign("plot_data", data_values[[as.character(input$val_select)]])
            
            # Plot
            highchart() %>% 
                hc_title(text = input$val_select) %>%
                hc_subtitle(text = "Trend in the considerd period") %>%
                hc_chart(type = "column") %>%
                hc_add_series(name = "Amount",
                              data = plot_data,
                              type = "column",
                              hcaes(x = plot_data$years, y =  plot_data$x),
                              color = "rgba(0, 102, 102, 0.6)",
                              yAxis = 0) %>%
                hc_xAxis(labels = list(style = list(fontSize = "12")),
                         opposite = FALSE) %>%
                hc_chart(plotBackgroundColor = "#EEEEEE") %>%
                hc_legend(enabled = FALSE)
        })
        
    }
    
    # UI
    shinyApp(ui = ui, server = server)
    
    库(闪亮)
    图书馆(shinydashboard)
    图书馆(高级特许)
    图书馆(dplyr)
    #生成数据
    年份=c(2009:2019)
    列表=向量(“列表”)
    var=c(“价值1”、“价值2”、“价值3”、“价值4”、“价值5”、“价值6”、“价值7”、“价值8”)
    (一分之一:长度(年)){
    x=runif(8,最小值=0,最大值=100)
    df=数据帧(变量,x)
    列表_db[[i]]=df
    }
    姓名(名单)=年
    #用户界面
    ui%
    hc_系列(列表(name=“变量”,
    点宽度=50,
    数据=mydata1$x_差异,
    color=“rgba(162,52,52,0.5)”)%>%
    hc_xAxis(标签=列表(样式=列表(fontSize=“12”))%>%
    hc#U图表(plotBackgroundColor=“#EEEEEE”)%>%
    hc_图例(启用=错误)
    })
    #输出'tab_2'%
    hc_标题(文本=输入$val_选择)%>%
    hc_副标题(text=“考虑期内的趋势”)%>%
    hc_图表(type=“column”)%>%
    hc_添加_系列(name=“Amount”,
    数据=绘图数据,
    type=“column”,
    hcaes(x=绘图数据$years,y=绘图数据$x),
    color=“rgba(0,102,102,0.6)”,
    yAxis=0)%>%
    hc_xAxis(标签=列表(样式=列表(fontSize=“12”)),
    相反=假)%>%
    hc#U图表(plotBackgroundColor=“#EEEEEE”)%>%
    hc_图例(启用=错误)
    })
    }
    #用户界面
    shinyApp(用户界面=用户界面,服务器=服务器)
    

    提前感谢任何能给我一些建议的人,我为我可能的“笨拙”代码提前道歉。

    第二个
    观察事件
    不起作用,因为您没有考虑空值。此外,最初的开始年和结束年是相同的,应该在反应性数据中加以说明。修复此部分后,左侧的图形很好,第二个图形的数据也很好。但是,我不确定这是否是您要在右侧绘制的数据。确定后,需要调整
    输出$tab_2
    中第二个highchart的语法。请尝试以下代码:

    library(DT)
    
    # Generate data
    years = c(2009:2019)
    
    list_db = vector("list")
    var = c("Value 1", "Value 2", "Value 3", "Value 4", "Value 5", "Value 6", "Value 7", "Value 8")
    
    for (i in 1:length(years)){
      x = runif(8, min = 0, max = 100)
      df = data.frame(var, x)
      list_db[[i]] = df
    }
    names(list_db) = years
    
    # UI
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(
        sidebarMenu(
          menuItem("Page 1", tabName = 'tab_page_1'),
          selectInput(inputId = "start_year",
                      label = "Select starting year:",
                      choices = min(years):max(years)),
          selectInput(inputId = "end_year",
                      label = "Select ending year:",
                      choices = min(years):max(years)),
          selectInput(inputId = "val_select",
                      label = "Select Value (within the selected range) to show:",
                      choices = var)
        )
      ),
      dashboardBody(
        tabItem(tabName = 'tab_page_1'),
        fluidPage(
          titlePanel("Example Page 1")
        ),
        fluidPage(
          useShinyjs(),
          fluidRow(
            box(title = "Barplot n.1",
                solidHeader = TRUE, 
                status = 'primary', 
                highchartOutput("tab_1", height = 500)
            ),
            box(title = "Barplot n.2 (Value focus)",
                solidHeader = TRUE, 
                status = 'primary',  DTOutput("tb2")
                #highchartOutput("tab_2", height = 500)
            ),
            
          )
        )
      )
    )
    
    # Server
    server <- function(input, output, session) {
      plotme <- reactiveValues(data=NULL)
      # Update 'end_year' based on 'start_year' input
      
      observeEvent(input$start_year, {
        updateSelectInput(session, 'end_year',
                          choices = (as.integer(input$start_year)+1):max(years)
        )
      })
      
      # Reactive data frame
      
      react_data <- reactive({
        req(input$start_year,input$end_year)
        
        if (input$start_year == input$end_year){
          dt <- NULL
        }else {
          # Generate starting and ending data frame
          assign("data_start", list_db[[as.character(input$start_year)]])
          assign("data_end", list_db[[as.character(input$end_year)]])
          
          # Add the selected year to variables' names
          data_start = data_start %>% rename_at(vars(-var), ~ paste0(., "_", input$start_year))
          data_end = data_end %>% rename_at(vars(-var), ~ paste0(., "_", input$end_year))
          
          # Join starting and ending data frame
          dt = full_join(data_start, data_end, by = "var")
          
          # Calculate vars' differences between the selected years
          dt$x_diff = dt[,paste0("x_",input$end_year)] - dt[,paste0("x_",input$start_year)] 
          
          # Select only first 4 Values
          dt = head(dt[order(dt$x_diff),],4)
        }
        dt
        
      })
      
      output$tb1 <- renderDT(react_data())
      
      # Update 'val_select' b <--- Problem fixed when you account for react_data() not being NULL
      
      observeEvent(list(input$start_year,input$end_year), {
        if (!is.null(react_data())) {
          mylist <- as.character(react_data()[,1])
          updateSelectInput(session, 'val_select', choices = mylist )
        }
      })
      
      # Output 'tab_1' <--- This works
      
      output$tab_1 = renderHighchart({ 
        if (is.null(react_data())) return(NULL)
        # Select data frame
        mydata1 = react_data()
        
        # Plot
        highchart() %>% 
          hc_chart(type = "bar") %>%
          hc_xAxis(categories = mydata1$var)  %>%
          hc_series(list(name = "Variables", 
                         pointWidth = 50, 
                         data = mydata1$x_diff, 
                         color = "rgba(162, 52, 52, 0.5)")) %>%
          hc_xAxis(labels = list(style = list(fontSize = "12"))) %>%
          hc_chart(plotBackgroundColor = "#EEEEEE") %>%
          hc_legend(enabled = FALSE)
      })
      
      observe({
        req(input$start_year,input$end_year,input$val_select)
        if (is.null(react_data())) return(NULL)
        # Select data frame
        mydata2 = react_data()
        
        # List of first 4 Value in the selected year range
        first_values = mydata2$var
        
        # List of years in the selected year range
        years = sort(c(min(as.numeric(input$start_year)):max(as.numeric(input$end_year))))
        
        # Create a list to contain data frame for each year (inside the selected range)
        data_year = vector("list", length(years))
        
        for (i in as.character(years)){
          
          assign("df", list_db[[i]])
          
          # Consider only Value in 'first_values'
          df = df[df$var %in% first_values,]
          
          # Insert into the list
          data_year[[i]] = df
          
        }
        # Remove empty elements from the list
        data_year = data_year[!sapply(data_year,is.null)]
        
        # Generate a yearly data frame for each Value
        data_values = vector("list", length(first_values))
        years_lead = years[-1]
        
        for (row in 1:length(data_values)){
          
          df = data_year[[as.character(years[1])]][row, c(1:length(data_year[[as.character(years[1])]]))]
          
          for (i in years_lead){
            df = rbind(df, data_year[[as.character(i)]][row, c(1:length(data_year[[as.character(i)]]))])
          }
          
          df = cbind(years, df)
          data_values[[row]] = df
          
        }
        
        # Assign names to the list
        names(data_values) = paste(first_values)
        
        # Select the dataframe based on the selected profession
        assign("plot_data", data_values[[as.character(input$val_select)]])
        plotme$data <- plot_data
        
        output$tb2 <- renderDT(plotme$data)
        
        # Output 'tab_2' <--- Problematic  - needs some work to fix the highchart
        
        output$tab_2 = renderHighchart({
          plot_data <- plotme$data
          if (is.null(plot_data)) return(NULL)
          # Plot
          plot_data %>% 
          highchart() %>% 
            hc_title(text = unique(plot_data$var)) %>%
            hc_subtitle(text = "Trend in the considerd period") %>%
            hc_chart(type = "column") %>%
            hc_add_series(name = "Amount",
                          #data = plot_data,
                          type = "column",
                          hcaes(x = plot_data$years, y =  plot_data$x),
                          color = "rgba(0, 102, 102, 0.6)",
                          yAxis = 0) %>%
            hc_xAxis(labels = list(style = list(fontSize = "12")),
                     opposite = FALSE) %>%
            hc_chart(plotBackgroundColor = "#EEEEEE") %>%
            hc_legend(enabled = FALSE)
        })
      })
      
    }
    
    # UI
    shinyApp(ui = ui, server = server)
    
    库(DT)
    #生成数据
    年份=c(2009:2019)
    列表=向量(“列表”)
    var=c(“价值1”、“价值2”、“价值3”、“价值4”、“价值5”、“价值6”、“价值7”、“价值8”)
    (一分之一:长度(年)){
    x=runif(8,最小值=0,最大值=100)
    df=数据帧(变量,x)
    列表_db[[i]]=df
    }
    姓名(名单)=年
    #用户界面
    ui%
    hc_添加_系列(name=“Amount”,
    #数据=绘图数据,
    type=“column”,
    hcaes(x=绘图数据$years,y=绘图数据$x),
    color=“rgba(0,102,102,0.6)”,
    yAxis=0)%>%
    hc_xAxis(标签=列表(样式=列表(fontSize=“12”)),
    相反=假)%>%
    hc#U图表(plotBackgroundColor=“#EEEEEE”)%>%
    hc_图例(启用=错误)
    })
    })
    }
    #用户界面
    shinyApp(用户界面=用户界面,服务器=服务器)
    

    非常感谢@YBS的友好回答。经过一些调整,它成功了。 我必须对
    mylist
    first\u值进行排序,以便在输入“选择值(在所选范围内)显示”中的所选选项与显示的表格/条形图之间建立对应关系。此外,第二个条形图的问题与我给垂直轴的名称有关…'我为这样的选择感到羞耻。事实上,我已经厌倦了
    ggplot2
    ,它成功了。然后,通过重命名变量,脚本工作正常。再次感谢你。下面是我根据你的建议修改的编辑脚本

    library(shiny)
    library(shinydashboard)
    library(highcharter)
    library(dplyr)
    library(DT)
    
    # Generate data
    years = c(2009:2019)
    
    list_db = vector("list")
    var = c("Value 1", "Value 2", "Value 3", "Value 4", "Value 5", "Value 6", "Value 7", "Value 8")
    
    for (i in 1:length(years)){
        x = runif(8, min = 0, max = 100)
        df = data.frame(var, x)
        list_db[[i]] = df
    }
    names(list_db) = years
    
    # UI
    ui <- dashboardPage(
        dashboardHeader(),
        dashboardSidebar(
            sidebarMenu(
                menuItem("Page 1", tabName = 'tab_page_1'),
                selectInput(inputId = "start_year",
                            label = "Select starting year:",
                            choices = min(years):max(years)),
                selectInput(inputId = "end_year",
                            label = "Select ending year:",
                            choices = min(years):max(years)),
                selectInput(inputId = "val_select",
                            label = "Select Value (within the selected range) to show:",
                            choices = var)
            )
        ),
        dashboardBody(
            tabItem(tabName = 'tab_page_1'),
            fluidPage(
                titlePanel("Example Page 1")
            ),
            fluidPage(
                fluidRow(
                    box(title = "Barplot n.1",
                        solidHeader = TRUE, 
                        status = 'primary',
                        highchartOutput("tab_1", height = 500)
                    ),
                    box(title = "Table n.1 (Value focus)",
                        solidHeader = TRUE, 
                        status = 'primary',
                        DTOutput("tab_2")
                    ),
                    box(title = "Barplot n.2 (Value focus)",
                        solidHeader = TRUE, 
                        status = 'primary',
                        highchartOutput("tab_3", height = 500)
                    )
                )
            )
        )
    )
    
    # Server
    server <- function(input, output, session) {
        
        plotme = reactiveValues(data = NULL)
        
        # Update 'end_year' based on 'start_year' input
        
        observeEvent(input$start_year, {
            updateSelectInput(session, 'end_year',
                              choices = (as.integer(input$start_year)+1):max(years)
            )
        })
        
        # Reactive data frame
        
        react_data = reactive({
            
            req(input$start_year, input$end_year)
            
            if (input$start_year == input$end_year){
                dt = NULL
            } else {
            
            # Generate starting and ending data frame
            assign("data_start", list_db[[as.character(input$start_year)]])
            assign("data_end", list_db[[as.character(input$end_year)]])
            
            # Add the selected year to variables' names
            data_start = data_start %>% rename_at(vars(-var), ~ paste0(., "_", input$start_year))
            data_end = data_end %>% rename_at(vars(-var), ~ paste0(., "_", input$end_year))
            
            # Join starting and ending data frame
            dt = full_join(data_start, data_end, by = "var")
            
            # Calculate vars' differences between the selected years
            dt$x_diff = dt[,paste0("x_",input$end_year)] - dt[,paste0("x_",input$start_year)] 
            
            # Select only first 4 Values
            dt = head(dt[order(dt$x_diff),],4)
            
            }
            
            dt
            
        })
    
        # Update 'val_select' 
        
        observeEvent(list(input$start_year,input$end_year), {
            if (!is.null(react_data())) {
                mylist = as.character(react_data()[,1])
                updateSelectInput(session, 'val_select', choices = sort(mylist))
            }
        })
        
        # Output 'tab_1' 
        
        output$tab_1 = renderHighchart({ 
            
            # Select data frame
            mydata1 = react_data()
            
            # Plot
            highchart() %>% 
                hc_chart(type = "bar") %>%
                hc_xAxis(categories = mydata1$var)  %>%
                hc_series(list(name = "Variables", 
                               pointWidth = 50, 
                               data = mydata1$x_diff, 
                               color = "rgba(162, 52, 52, 0.5)")) %>%
                hc_xAxis(labels = list(style = list(fontSize = "12"))) %>%
                hc_chart(plotBackgroundColor = "#EEEEEE") %>%
                hc_legend(enabled = FALSE)
        })
        
        # Output 'tab_2' and 'tab_3'
        
        observe({
            req(input$start_year,input$end_year,input$val_select)
            if (is.null(react_data())) return(NULL)
            
            # Select data frame
            mydata2 = react_data()
            
            # List of first 4 Value in the selected year range
            first_values = mydata2$var
            first_values = sort(first_values)
            
            # List of years in the selected year range
            years = sort(c(min(as.numeric(input$start_year)):max(as.numeric(input$end_year))))
            
            # Create a list to contain data frame for each year (inside the selected range)
            data_year = vector("list", length(years))
            
            for (i in as.character(years)){
                
                assign("df", list_db[[i]])
                
                # Consider only Value in 'first_values'
                df = df[df$var %in% first_values,]
                
                # Insert into the list
                data_year[[i]] = df
                
            }
            # Remove empty elements from the list
            data_year = data_year[!sapply(data_year,is.null)]
            
            # Generate a yearly data frame for each Value
            data_values = vector("list", length(first_values))
            years_lead = years[-1]
            
            for (row in 1:length(data_values)){
                
                df = data_year[[as.character(years[1])]][row, c(1:length(data_year[[as.character(years[1])]]))]
                
                for (i in years_lead){
                    df = rbind(df, data_year[[as.character(i)]][row, c(1:length(data_year[[as.character(i)]]))])
                }
                
                df = cbind(years, df)
                data_values[[row]] = df
                
            }
            
            # Assign names to the list
            names(data_values) = paste(first_values)
            
            # Select the dataframe based on the selected value
            assign("plot_data", data_values[[as.character(input$val_select)]])
            
            plotme$data = plot_data
            
            # Plot table 'tab_2'
            
            output$tab_2 = renderDT(plotme$data)
            
            # Plot table 'tab_3'
            
            output$tab_3 = renderHighchart({
                
                #plot_data = plotme$data
                if (is.null(plot_data)) return(NULL)
                
                names(plot_data)[names(plot_data) == 'x'] = 'variable'
    
                highchart() %>% 
                    hc_title(text = unique(plot_data$var)) %>%
                    hc_subtitle(text = "Trend in the considerd period") %>%
                    hc_chart(type = "column") %>%
                    hc_add_series(name = "Amount",
                                  data = plot_data,
                                  type = "column",
                                  hcaes(x = years, y = variable),
                                  color = "rgba(0, 102, 102, 0.6)",
                                  yAxis = 0) %>%
                    hc_xAxis(labels = list(style = list(fontSize = "12")),
                             opposite = FALSE) %>%
                    hc_chart(plotBackgroundColor = "#EEEEEE") %>%
                    hc_legend(enabled = FALSE)
                
                })
            
        })
        
    }
    
    # UI
    shinyApp(ui = ui, server = server)
    
    库(闪亮)
    图书馆(shinydashboard)
    图书馆(高级特许)
    图书馆(dplyr)
    图书馆(DT)
    #生成数据
    年份=c(2009:2019)
    列表=向量(“列表”)
    var=c(“价值1”、“价值2”、“价值3”、“价值4”、“价值5”、“价值6”、“价值7”、“价值8”)
    (一分之一:长度(年)){
    x=runif(8,最小值=0,最大值=100)
    df=数据帧(变量,x)
    列表_db[[i]]=df
    }
    姓名(名单)=年
    #用户界面
    ui%
    hc_图表(type=“bar”)%>%
    
    library(shiny)
    library(shinydashboard)
    library(highcharter)
    library(dplyr)
    library(DT)
    
    # Generate data
    years = c(2009:2019)
    
    list_db = vector("list")
    var = c("Value 1", "Value 2", "Value 3", "Value 4", "Value 5", "Value 6", "Value 7", "Value 8")
    
    for (i in 1:length(years)){
        x = runif(8, min = 0, max = 100)
        df = data.frame(var, x)
        list_db[[i]] = df
    }
    names(list_db) = years
    
    # UI
    ui <- dashboardPage(
        dashboardHeader(),
        dashboardSidebar(
            sidebarMenu(
                menuItem("Page 1", tabName = 'tab_page_1'),
                selectInput(inputId = "start_year",
                            label = "Select starting year:",
                            choices = min(years):max(years)),
                selectInput(inputId = "end_year",
                            label = "Select ending year:",
                            choices = min(years):max(years)),
                selectInput(inputId = "val_select",
                            label = "Select Value (within the selected range) to show:",
                            choices = var)
            )
        ),
        dashboardBody(
            tabItem(tabName = 'tab_page_1'),
            fluidPage(
                titlePanel("Example Page 1")
            ),
            fluidPage(
                fluidRow(
                    box(title = "Barplot n.1",
                        solidHeader = TRUE, 
                        status = 'primary',
                        highchartOutput("tab_1", height = 500)
                    ),
                    box(title = "Table n.1 (Value focus)",
                        solidHeader = TRUE, 
                        status = 'primary',
                        DTOutput("tab_2")
                    ),
                    box(title = "Barplot n.2 (Value focus)",
                        solidHeader = TRUE, 
                        status = 'primary',
                        highchartOutput("tab_3", height = 500)
                    )
                )
            )
        )
    )
    
    # Server
    server <- function(input, output, session) {
        
        plotme = reactiveValues(data = NULL)
        
        # Update 'end_year' based on 'start_year' input
        
        observeEvent(input$start_year, {
            updateSelectInput(session, 'end_year',
                              choices = (as.integer(input$start_year)+1):max(years)
            )
        })
        
        # Reactive data frame
        
        react_data = reactive({
            
            req(input$start_year, input$end_year)
            
            if (input$start_year == input$end_year){
                dt = NULL
            } else {
            
            # Generate starting and ending data frame
            assign("data_start", list_db[[as.character(input$start_year)]])
            assign("data_end", list_db[[as.character(input$end_year)]])
            
            # Add the selected year to variables' names
            data_start = data_start %>% rename_at(vars(-var), ~ paste0(., "_", input$start_year))
            data_end = data_end %>% rename_at(vars(-var), ~ paste0(., "_", input$end_year))
            
            # Join starting and ending data frame
            dt = full_join(data_start, data_end, by = "var")
            
            # Calculate vars' differences between the selected years
            dt$x_diff = dt[,paste0("x_",input$end_year)] - dt[,paste0("x_",input$start_year)] 
            
            # Select only first 4 Values
            dt = head(dt[order(dt$x_diff),],4)
            
            }
            
            dt
            
        })
    
        # Update 'val_select' 
        
        observeEvent(list(input$start_year,input$end_year), {
            if (!is.null(react_data())) {
                mylist = as.character(react_data()[,1])
                updateSelectInput(session, 'val_select', choices = sort(mylist))
            }
        })
        
        # Output 'tab_1' 
        
        output$tab_1 = renderHighchart({ 
            
            # Select data frame
            mydata1 = react_data()
            
            # Plot
            highchart() %>% 
                hc_chart(type = "bar") %>%
                hc_xAxis(categories = mydata1$var)  %>%
                hc_series(list(name = "Variables", 
                               pointWidth = 50, 
                               data = mydata1$x_diff, 
                               color = "rgba(162, 52, 52, 0.5)")) %>%
                hc_xAxis(labels = list(style = list(fontSize = "12"))) %>%
                hc_chart(plotBackgroundColor = "#EEEEEE") %>%
                hc_legend(enabled = FALSE)
        })
        
        # Output 'tab_2' and 'tab_3'
        
        observe({
            req(input$start_year,input$end_year,input$val_select)
            if (is.null(react_data())) return(NULL)
            
            # Select data frame
            mydata2 = react_data()
            
            # List of first 4 Value in the selected year range
            first_values = mydata2$var
            first_values = sort(first_values)
            
            # List of years in the selected year range
            years = sort(c(min(as.numeric(input$start_year)):max(as.numeric(input$end_year))))
            
            # Create a list to contain data frame for each year (inside the selected range)
            data_year = vector("list", length(years))
            
            for (i in as.character(years)){
                
                assign("df", list_db[[i]])
                
                # Consider only Value in 'first_values'
                df = df[df$var %in% first_values,]
                
                # Insert into the list
                data_year[[i]] = df
                
            }
            # Remove empty elements from the list
            data_year = data_year[!sapply(data_year,is.null)]
            
            # Generate a yearly data frame for each Value
            data_values = vector("list", length(first_values))
            years_lead = years[-1]
            
            for (row in 1:length(data_values)){
                
                df = data_year[[as.character(years[1])]][row, c(1:length(data_year[[as.character(years[1])]]))]
                
                for (i in years_lead){
                    df = rbind(df, data_year[[as.character(i)]][row, c(1:length(data_year[[as.character(i)]]))])
                }
                
                df = cbind(years, df)
                data_values[[row]] = df
                
            }
            
            # Assign names to the list
            names(data_values) = paste(first_values)
            
            # Select the dataframe based on the selected value
            assign("plot_data", data_values[[as.character(input$val_select)]])
            
            plotme$data = plot_data
            
            # Plot table 'tab_2'
            
            output$tab_2 = renderDT(plotme$data)
            
            # Plot table 'tab_3'
            
            output$tab_3 = renderHighchart({
                
                #plot_data = plotme$data
                if (is.null(plot_data)) return(NULL)
                
                names(plot_data)[names(plot_data) == 'x'] = 'variable'
    
                highchart() %>% 
                    hc_title(text = unique(plot_data$var)) %>%
                    hc_subtitle(text = "Trend in the considerd period") %>%
                    hc_chart(type = "column") %>%
                    hc_add_series(name = "Amount",
                                  data = plot_data,
                                  type = "column",
                                  hcaes(x = years, y = variable),
                                  color = "rgba(0, 102, 102, 0.6)",
                                  yAxis = 0) %>%
                    hc_xAxis(labels = list(style = list(fontSize = "12")),
                             opposite = FALSE) %>%
                    hc_chart(plotBackgroundColor = "#EEEEEE") %>%
                    hc_legend(enabled = FALSE)
                
                })
            
        })
        
    }
    
    # UI
    shinyApp(ui = ui, server = server)