R语言 在Shiny中使用appendTab()并使用ggplot创建图表:图表正在发生变化

7lrncoxx  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(103)

这是我的代码
我用appendTab()创建面板的想法是让用户创建图表,然后单击按钮运行某种模型
这个想法几乎是doen,但我注意到,当我回到第一个面板的图表的颜色是相同的最后一个图表。
这里我有一个GIF,显示当我回到前一个面板时,颜色始终保持最后一个颜色(黄色)。
为什么?为什么?


的数据

library(shiny)
library(dplyr)
library(stringr)
library(ggplot2)

colors_hex <- c("#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#FF00FF")

data <- gapminder::gapminder %>% filter(country == 'Italy')

# Adiciona ruído aleatório aos valores da coluna 'pop'
desvio_maximo = 0.05  # Ajuste conforme necessário para controlar o desvio máximo
noise <- rnorm(n = nrow(data), mean = 0, sd = desvio_maximo * mean(data$pop))
pop_com_ruido <- data$pop + noise
ui <- fluidPage(
  
  navbarPage(
    "Rodando Modelos Econométricos com seus dados...",
    id = "tabs"
  ),
  actionButton("add_tab", "Adicione um Painel"),
  tableOutput("head"),

  uiOutput("tabs_content")
  
)

server <- function(input, output, session) {

  observeEvent(input$add_tab, {
    tab_name <- paste("Gráfico e Regressão Modelo ", input$add_tab)
    appendTab(
      inputId = "tabs",
      tabPanel(tab_name,
               actionButton(inputId = str_remove_all(paste0(tab_name,'criar')," "),
                            paste0("Crie o Gráfico")),
               actionButton(inputId = str_remove_all(paste0(tab_name,'mod')," "),
                            paste0("Rode a ",tab_name)),
               plotOutput(paste0("plot",input$add_tab))
      ),
      select = TRUE
    )
      observeEvent(
        input[[str_remove_all(paste0(tab_name,'criar')," ")]],{
          output[[paste0("plot",input$add_tab)]] <- renderPlot({
          p <- ggplot(data = data,aes(x = year, y = pop)) + geom_line( color = colors_hex[input$add_tab])
          p
        }
      )
     
      
    })
      observeEvent(
        input[[str_remove_all(paste0(tab_name,'mod')," ")]],{
          output[[paste0("plot",input$add_tab)]] <- renderPlot({
            ggplot(data = data,aes(x = year, y = pop)) + 
              geom_line(color = colors_hex[input$add_tab])+
              geom_line(aes(x = year, pop_com_ruido),color = 'black',size = 4)
          }
          )
        })
       
  })
}

shinyApp(ui, server)

字符串

ve7v8dk2

ve7v8dk21#

问题是你使用input$add_tab作为所有的颜色值。由于这是一个React值,每次该值改变时它都会被重新计算。它的当前值不与图本身一起存储。为了防止它是React的,你想隔离当前值。你可以这样做

server <- function(input, output, session) {
  observeEvent(input$add_tab, {
    new_index <- isolate(input$add_tab)
    tab_name <- paste("Gráfico e Regressão Modelo ", new_index)
    tab_color <- colors_hex[new_index]
    
    appendTab(
      inputId = "tabs",
      tabPanel(tab_name,
               actionButton(inputId = str_remove_all(paste0(tab_name,'criar')," "),
                            paste0("Crie o Gráfico")),
               actionButton(inputId = str_remove_all(paste0(tab_name,'mod')," "),
                            paste0("Rode a ",tab_name)),
               plotOutput(paste0("plot",new_index))
               
      ),
      select = TRUE
    )

    observeEvent(
      input[[str_remove_all(paste0(tab_name,'criar')," ")]],{
        output[[paste0("plot",new_index)]] <- renderPlot({
          p <- ggplot(data = data,aes(x = year, y = pop)) + 
            geom_line( color = tab_color)
          p
        })
        
      })
    
    observeEvent(
      input[[str_remove_all(paste0(tab_name,'mod')," ")]],{
        output[[paste0("plot",new_index)]] <- renderPlot({
          ggplot(data = data,aes(x = year, y = pop)) + 
            geom_line(color = tab_color)+
            geom_line(aes(x = year, pop_com_ruido),color = 'black',size = 4)
        })
      })
    
  })
}

shinyApp(ui, server)

字符串
我们用new_index <- isolate(input$add_tab)捕获当前值,然后在创建其他React对象时使用该值。

相关问题