Reactive source está "espalhando" seu efeito em outras reações em um shinyApp

A função sliderInput possui o argumento animate, o qual deixa-o reativo. O problema é que este argumento “espalha” seu efeito em outras reações do aplicativo, às vezes tornando impossível a manipulação destes. Veja este caso:

Tenho um dropdownMenu reativo, o qual faço uso de dropdownMenuOutput e renderMenu. Com uso de animate dentro de sliderInput, o dropdownMenu sofre efeito por conta disso.

Uma analogia seria a de um imóvel que, quando se liga o chuveiro, as luzes da casa ficam mais fracas ou até mesmo piscam:

sliderInput(animate) → CHUVEIRO
outras reatividades → luzes da casa

Efeito no app:

ezgif.com-gif-maker

O dropdownMenu, que nada tem a ver com sliderInput com o argumento animate, está sendo afetado. Este é meu app:

library(shiny)
library(shinydashboard)

header <- dashboardHeader(
  
  title = "Dashboard", 
  titleWidth = 300, 
  
  dropdownMenuOutput(
    outputId = "drop1"
  )
  
)

sidebar <- dashboardSidebar(
  
  width = 300
  
)

body <- dashboardBody(
  
  sliderInput(
    inputId = "one", 
    label = "Registro 1", 
    value = 1, 
    animate = animationOptions(
      interval = 500, loop = TRUE
    ),  
    min = 1, 
    max = 10, 
    step = 1, 
    ticks = TRUE
  ), 
  
  sliderInput(
    inputId = "two",
    label = "Registro 2", 
    value = 1, 
    animate = animationOptions(
      interval = 500, loop = TRUE
    ),  
    min = 1, 
    max = 10, 
    step = 1, 
    ticks = TRUE
  ), 
  
  sliderInput(
    inputId = "three", 
    label = "Luz da sala", 
    value = 1, 
    animate = animationOptions(
      interval = 500, loop = TRUE
    ),  
    min = 1, 
    max = 10, 
    step = 1, 
    ticks = TRUE
  ), 
  
  valueBoxOutput(
    outputId = "box1"
  )
  
)

ui <- dashboardPage(
  
  header = header, 
  sidebar = sidebar, 
  body = body
  
)

server <- function(session, input, output) {
  
  fx <- function(x, y) {
    
    x + y
    
  }
  
  fy <- function(x) {
    
    x
    
  }
  
  reac_0 <- reactive({
    
    tibble::tibble(
      one = input$one, 
      two = input$two, 
      three = input$three
    )
    
  })
  
  chuveiro <- reactive({
    
    temp <- reac_0()
    fx(
      x = temp$one, 
      y = temp$two
    )
    
  })
  
  luz <- reactive({
    
    temp <- reac_0()
    fy(
      x = temp$three
    )
    
  })
  
  fdrop <- function(x) {
    
    if (x <= 5) {
        
      dropdownMenu(
        type = "notifications",
        badgeStatus = NULL,
        headerText = "Not 1", 
        notificationItem(
          text = HTML(
            "<text style='color:#020202;'>Without.</text>"
          ),
          status = "danger",
          icon = icon("times"),
          href = NULL
        )
      )
      
    } else (
      dropdownMenu(
        type = "notifications",
        badgeStatus = "danger",
        headerText = "Not 2", 
        notificationItem(
          text = HTML(
            "<a style='color:#020202;'
          href='https://www.instagram.com' target='_blank' title='A'>
          With</a>"
          ),
          status = "success",
          icon = icon("tags")
        )
      )
    )
  }
  
  output$drop1 <- renderMenu({
    
    expr = fdrop(x = luz())
    
  })
  
  output$box1 <- renderValueBox({
    
    expr = valueBox(
      value = chuveiro(), 
      subtitle = "Sum"
    )
    
  })
  
}

shinyApp(ui, server)

Tentei usar isolate, colocar o sliderInput no server através de uiOutput e renderUI e observeEvent, mas não consegui cancelar esse efeito do sliderInput(animate) nas outras reações.

De novo, a analogia é parecida com a de uma instalação elétrica de uma casa. O que me intriga é que chuveiro não tem relação com luz e, mesmo assim, ocorre este efeito colateral.

Nota: preciso que animate funcione quanto abro o meu app, portanto, não poderia usar um actionButton() + req() + isolate(). Só queria que ele parasse de “espalhar” seu efeito por todo o aplicativo.

Eu esqueci de retirar o reac_0(). Como ele considera todos os inputs, então ele ativa todos eles. A solução é a remoção:

  chuveiro <- reactive({
    
    fx(
      x = input$one, 
      y = input$two
    )
    
  })
  
  luz <- reactive({
    
    fy(
      x = input$three
    )
    
  }) 

E está bem.

1 curtida