No último post, falamos sobre as três peças fundamentais do fluxo de reatividade de um app: os valores reativos, as expressões reativas e os observers, o foco deste post.
Os observers são o ponto final de um diagrama de reatividade de um aplicativo Shiny e, sem eles, o fluxo reativo não acontece. As funções render*()
, que geram os nossos outputs, são o tipo mais comum de observer. Mas eles não são os únicos.
Muitas vezes queremos usar a reatividade para disparar ações que não estão ligadas a geração de outputs, como o registro de informações em bases de dados ou a atualização de elementos da UI.
Nesses casos, podemos utilizar as funções observe()
e oberveEvent()
. Elas funcionam de maneira similar às funções reactive()
e eventReactive()
, mas em vez de criar expressões reativas, elas são observers.
A função observe()
A função observe({codigo})
monitora os valores e expressões reativas que estão dentro dela e roda seu código quando algum desses valores são modificados.
A diferença do observe()
para a função reactive()
é que a primeira não gera expressões reativas, servindo apenas para códigos que têm efeitos colaterais.
Essa função é muito utilizada com as funções da família update*()
, que servem para atualizar valores de um input na UI.
Na segunda caixa de seleção do exemplo a seguir, queremos selecionar apenas os filmes do(a) diretor(a) que selecionamos na primeira. Veja que usamos o texto Carregando...
como um placeholder para o segundo selectInput()
.
ui <- fluidPage(
selectInput(
"dir",
"Selecione um(a) diretor(a)",
choices = sort(unique(imdb$diretor))
),
selectInput(
"filme",
"Selecione um filme",
choices = "Carregando..."
)
)
No server
, atualizamos as escolhas da segunda caixa de seleção com a função updateSelectInput()
. Veja que, como essa função está dentro de um observe
, esse código será rodado novamente sempre que o valor de input$dir
mudar.
server <- function(input, output, session) {
observe({
opcoes <- imdb |>
dplyr::filter(diretor == input$dir) |>
dplyr::pull(titulo)
updateSelectInput(
session,
inputId = "filme",
choices = opcoes
)
})
}
A função observeEvent()
A função observeEvent()
funciona assim como a observe()
, mas ela escuta apenas um valor ou expressão reativa, que é definido em seu primeiro argumento, assim como na função eventReactive()
.
Ela é muito utiliza para disparar ações, como gravar informações em uma base de dados, a partir de botões.
No exemplo a seguir, queremos salvar o e-mail de uma pessoa quando ela clicar no botão “Enviar dados”. A função observeEvent()
roda o código definido dentro dela quando o botão é clicado, salvando o e-mail em um arquivo de texto.
ui <- fluidPage(
textInput("email", "Informe seu e-mail"),
actionButton("enviar", "Enviar dados")
)
server <- function(input, output, session) {
observeEvent(input$enviar, {
write(input$email, "emails.txt", append = TRUE)
})
}
As funções observe()
e oberveEvent()
aumentam bastante o leque de opções dos nossos aplicativos. Agora conseguimos criar fluxos reativos que não estão associados necessariamente a um output. Nessa linha, no nosso próximo post sobre reatividade, falaremos sobre como criar valores reativos que não estão associados a inputs.
É isso! Dúvidas, sugestões e críticas, mande aqui nos comentários.
Até a próxima!