¿Botón de actualización sencillo en flexdashboard/Shiny?
Tengo un formulario/encuesta de Google que guarda las respuestas en una hoja de Google.
Los datos de la hoja de Google se ingresan en mi aplicación flexdashboard/shiny, pero si se guarda una respuesta mientras alguien está usando la aplicación, la única forma de ver la respuesta es haciendo clic en “actualizar” en el navegador.
Me gustaría agregar un botón que pueda reiniciar la aplicación sin que el usuario haga clic en “actualizar”. ¿Es esto posible?
Aquí tienes un código que he escrito, pero no parece funcionar.
---
title: "Test"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
runtime: shiny
---
```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(DT)
library(gsheet)
</code></pre>
<h2>Inputs {.sidebar data-width=300}</h2>
```{r}
jscode <- "shinyjs.refresh = function() { history.go(0); }"
actionButton(jscode, "Refresh")
observeEvent(input$reset, {
})
Column
-------------------------------------
### Chart A
```{r}
data <- gsheet2tbl('https://docs.google.com/spreadsheets/d/1CB2IQHb3g5d8KsEr-_lJNXPKnTBn2nhz_-AzBjRyRK4/edit#gid=0')
datatable(data,
editable = TRUE,
options = list(
columnDefs = list(list(className = 'dt-center', targets = "_all")))
)
</code></pre>
```
davy.ai
Una posible solución para actualizar automáticamente la aplicación Shiny cuando se agreguen nuevos datos a la hoja de Google es utilizar la función
invalidateLater()
del paqueteshiny
en combinación con un observador. Aquí tienes un ejemplo de cómo hacer esto:“`{r}
library(shiny)
establecer el intervalo (en milisegundos) para buscar nuevos datos
refresh_interval <- 5000
crear una función reactiva que lee los datos de la hoja de Google
get_data <- reactive({
data <- gsheet2tbl(‘https://docs.google.com/spreadsheets/d/1CB2IQHb3g5d8KsEr-_lJNXPKnTBn2nhz_-AzBjRyRK4/edit#gid=0’)
data
})
crear un valor reactivo para almacenar la última marca de tiempo actualizada
last_updated <- reactiveVal(NULL)
crear un observador que compruebe si hay nuevos datos cada “refresh_interval” milisegundos
observe({
invalidateLater(refresh_interval)
# obtener la marca de tiempo actual
current_time <- Sys.time()
# comprobar si la hoja de Google se ha actualizado desde la última comprobación
if (!identical(last_updated(), current_time)) {
# actualizar el valor reactivo con la nueva marca de tiempo
last_updated(current_time)
}
})
crear la interfaz de usuario Shiny
ui <- fluidPage(
# agregar un botón de acción para actualizar manualmente la aplicación
actionButton(“refresh_btn”, “Actualizar”),
# mostrar los datos en una tabla
dataTableOutput(“data_table”)
)
crear el servidor Shiny
server <- function(input, output, session) {
# mostrar los datos en la tabla
output$data_table <- renderDataTable({
get_data()
})
# agregar un observador para actualizar la aplicación cuando se presione el botón “refresh_btn”
observeEvent(input$refresh_btn, {
last_updated(NULL)
})
}
ejecutar la aplicación Shiny
shinyApp(ui, server)
“`
En este ejemplo, utilizamos la función
invalidateLater()
para buscar nuevos datos cada 5 segundos. Si se encuentran nuevos datos, actualizamos el valor reactivolast_updated
con la marca de tiempo actual y activamos una actualización reactiva de los datos. También agregamos un botón de acción para actualizar manualmente la aplicación, que restablece el valor delast_updated
aNULL
y activa una nueva comprobación de nuevos datos.