es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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>

```

Tags:  , ,

Answer

  1. Avatar for 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 paquete shiny 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)

    # activar una actualización reactiva de los datos
    get_data()
    

    }
    })

    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 reactivo last_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 de last_updated a NULL y activa una nueva comprobación de nuevos datos.

Comments are closed.