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:
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.