Aplicar JavaScript em elementos criados no server (Shiny)

Eu tenho um Shiny App em golem e estou com um problema com dois actionButton()'s que foram criados no lado do servidor (server). Estão ali porque um deles fora criado dentro uma estrutura condicional (if else) e o outro dentro de observeEvent(). Tudo isso foi feito dada a uma idiossincrasia da análise.

Já agora, em partes:

actionButton() dentro da estrutura condicional (dentro do file.server):

fsoma <- function(x) {
  if (x != 100) {
    "A soma deve ser 100!"
  
  } else
    (actionButton(
      inputId = "sbtn1",
      label = "OK",
      icon = icon("play-circle-o"),
      style = "color: #f2f2f2; background-color: #333333;
      border-color: #333333;"
    ))

  }

actionButton() dentro de observeEvent() (dentro do file.server):

observeEvent(input$sbtn1, {
  output$sbtn2 <- renderUI({
    actionButton(
      inputId = "sbtn2",
      label = "",
      title = "Ver/ esconder análise",
      icon = icon('eye'),
      style = "color: #f2f2f2; background-color: #008cba;
                 border-color: #333333;"
    )
  })
})

Note que sbtn2 aparece apenas após o clique em sbtn1. Eu uso bastante JS em minhas aplicações mas o porém é que quando se cria um elemento ao lado do server, este id não está disponível ao DOM, o que eu já esperava, pois nada foi criado na parte do ui, apenas ao server.

O meu problema está ai…

Eu apenas gostaria de saber se há alguma forma de acessar os id's dos elementos criados no lado do servidor (server) para aplicar as funções JS.

Para melhor auxiliar na resposta, considere este aplicativo abaixo:

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
  ),
  
  valueBoxOutput(
    outputId = "box1"
  )
  
)

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

server <- function(session, input, output) {
  
  fsoma <- function(x) {
    if (x != 10) {
      "Error!"
      
    } else
      (actionButton(
        inputId = "sbtn1",
        label = "OK",
        icon = icon("play-circle-o"),
        style = "color: #f2f2f2; background-color: #333333;
      border-color: #333333;"
      ))
    
  }
  
  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
    )
    
  })
  
  output$box1 <- renderValueBox({
    
    expr = valueBox(
      value = fsoma(x = chuveiro()), 
      subtitle = "Sum"
    )
    
  })
  
}

shinyApp(ui, server)

onde quero modificar #sbtn1 no meu JS. Qualquer efeito que eu aplique nele, algo como:

$(function() {
  $("#sbtn1").css("background-color", "red");  
});

não funciona pois o botão é criado depois após a execução do JS. Eu preciso vincular o botão ao script executando-o após a criação do botão ou adicionando um ouvinte para observar a alteração da exibição. Eu não estou conseguindo fazer isso.

Sei que esta nem é uma pergunta de R, apenas está vinculada a estilização de um Shiny App. Mas agradeço qualquer auxílio, mesmo que seja alguma indicação de leitura para eu me informar melhor sobre este caso e resolver por aqui mesmo.

NOTA:

Eu prefiro o arquivo .js ao invés de usar shinyjs para deixar meu aplicativo ao lado do R menos poluído com outras linguagens.

Mas, se ajudar, segue o código abaixo para reproduzir o JS no shiny:

js1 <- "$(function() {
  $('.skin-blue').addClass('sidebar-mini');
});
"

body <- dashboardBody(

  shinyjs::useShinyjs(),
  shinyjs::extendShinyjs(text = js1, functions = "JS"),

Basta apenas fazer a substituição no app.

A solução é:

1) vincular uma tags$div ao elemento alvo, neste caso o inputID = sbtn1 dentro do actionButton;

2) adicionar o código JS dentro de tags$script dentro da condicional. Assim, o script sempre será executado no elemento correspondente.

Desta forma:

  fsoma <- function(x) {
    if (x != 100) {
      "A soma deve ser 100!"
  
    }     else (
      tags$div(actionButton(
        inputId = "sbtn1",
        label = "OK",
        icon = icon("play-circle-o"),
        style = "color: #f2f2f2; background-color: #333333;
                         border-color: #333333;"
      ), 
      tags$script('$(function() {
      $("#sbtn2").on("click", function() {
      setTimeout(function() {
      $("#sbtn1").click();
      }, 1000);
      });
      });')
      )
    )

}

Neste caso, eu queria que o botão #sbtn1 fosse acionado (clicado) após 1 segundo do clique no botão #sbtn2.