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.