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.

La variable reactiva no puede ser renderizada automáticamente en R Shiny.

Estoy escribiendo una tabla en línea mediante Shiny de lenguaje R, pero algo confuso me detiene.

Lo que necesito es:
1. Mostrar la tabla completa por primera vez.
2. Si escribes un número en el bloque de entrada y lo envías, solo muestra automáticamente las primeras n filas de la tabla.

Lo que veo es:

DFflt, la variable detrás de la tabla, ya ha cambiado después del envío, pero la tabla en la página web no puede ser recargada antes de que vuelvas a cargar manualmente la página.

¿Qué puedo hacer para solucionar este problema? ¡Gracias!

library(shiny)
library(tidyverse)

DF <- mpg
DFflt <- mpg

ui <- fluidPage(
  numericInput("nrow", "Cortar las primeras n filas de DF", value = 0),
  actionButton("submit", "Enviar"),
  actionButton("p_DFflt", "Imprimir DFflt en la consola"),
  div('Render DFflt:'),
  tableOutput("table")
)

server <- function(input, output, session) {
  observeEvent(input$submit, {
    nrow <- input$nrow
    if (nrow > 10) {
      showNotification(str_c("Inválido", type="error"))
    } else {
      DFflt <<- DF %>% head(nrow)
    }
  })

  observeEvent(input$p_DFflt, {
    print(DFflt)
  })

  output$table <- renderTable({
    DFflt
  })
}

shinyApp(ui, server)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema, puedes utilizar expresiones reactivas para controlar la salida de la tabla en base a la entrada del usuario. Aquí está el código actualizado:

    library(shiny)
    library(tidyverse)
    
    DF <- mpg
    DFflt <- mpg
    
    ui <- fluidPage(
      numericInput("nrow", "Mostrar las primeras n filas de DF", value = 0),
      actionButton("submit", "Enviar"),
      actionButton("p_DFflt", "Imprimir DFflt en consola"),
      div("Renderizar DFflt: "),
      tableOutput("table")
    )
    
    server <- function(input, output, session) {
    
      # Utilizar una expresión reactiva para controlar la salida de la tabla
      output$table <- reactive({
        if (input$nrow == 0) {
          DFflt
        } else {
          DFflt %>% head(input$nrow)
        }
      })
    
      observeEvent(input$submit, {
        nrow <- input$nrow
        if (nrow > 10) {
          showNotification(str_c("Inválido", type="error"))
        } else {
          DFflt <<- DF %>% head(nrow)
        }
      })
    
      observeEvent(input$p_DFflt, { print(DFflt) })
    }
    
    shinyApp(ui, server)
    

    En el código actualizado, utilizamos una expresión reactiva output$table que controla la salida de la tabla en función de la entrada del usuario. Si input$nrow es 0, se muestra la tabla completa. De lo contrario, se muestran las primeras input$nrow filas. Note que utilizamos <<- en lugar de <- para asignar DFflt para que se actualice globalmente y pueda ser utilizada en la expresión reactiva.

Comments are closed.