这是我的代码

我的 idea 是用appendTab()e创建面板,让用户创建图表,然后点击一个按钮来运行某种模型

这个 idea 几乎是可行的,但我注意到,当我回到第一个面板时,图表的 colored颜色 与最后一个图表的 colored颜色 相同.

这里我有一个gif显示,当我返回到上一个面板时, colored颜色 始终保持最后一个 colored颜色 (黄色).

为什么?

enter image description here

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)

推荐答案

问题是所有 colored颜色 值都使用input$add_tab.因为这是一个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 对象时使用该值.

R相关问答推荐

按崩溃类别分类的指数

使用Shiny组合和显示复制和粘贴的数据

如何替换R中数据集列中的各种字符串

删除facet_wrap标签之间的水平线

对lme 4对象运行summary()时出错(diag中的错误(from,names = RST):对象unpackedMatrix_diag_get找不到)

R:更新后无法运行控制台

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

删除列表中存储的数据帧内和数据帧之间的重复行

将嵌套列表子集化为嵌套列表

在R中无法读入具有Readxl和lApply的数据集

根据文本字符串中的值粘贴新列

使用列/行匹配将两个不同维度的矩阵相加

如何使用tryCatch执行语句并忽略警告?

根据列A中的差异变异列,其中行由列B中的相对值标识

如何在PackageStatus()中列出&q;不可用的包&q;?

当每个变量值只能 Select 一次时,如何从数据框中 Select 两个变量的组合?

数值型数据与字符混合时如何进行绑定

从矩阵创建系数图

使用nls()函数的非线性模型的半正态图

创建由三个单独的shapefile组成的单个 map