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.

R Shiny: Cómo abrir una ventana emergente y mostrar un gráfico que depende del evento de clic en una fila de la tabla DT En R Shiny, es posible abrir una ventana emergente y mostrar un gráfico que depende del evento de clic en una fila de la tabla DT. Aquí te mostraremos cómo hacerlo: 1. En primer lugar, asegúrate de tener instalada la biblioteca ‘shiny’ en tu entorno R. 2. Crea la interfaz de usuario (UI) de Shiny en tu archivo R. Puedes hacerlo usando la función `shinyUI` y definiendo la estructura de tu aplicación. 3. Dentro de la función `shinyUI`, agrega una función `dataTableOutput` para mostrar la tabla DT en tu interfaz de usuario. Por ejemplo: “`R shinyUI( fluidPage( dataTableOutput(“myTable”) ) ) “` 4. Luego, en tu archivo R, crea la función de servidor (server) de Shiny usando la función `shinyServer`. Aquí es donde manejarás el evento de clic en una fila y mostrarás la ventana emergente con el gráfico correspondiente. 5. Dentro de la función `shinyServer`, define una estructura lógica para el evento de clic en una fila de la tabla DT. Por ejemplo: “`R shinyServer(function(input, output, session) { output$myTable <- renderDataTable({ DT::datatable(my_data, rownames = FALSE, options = list( rowCallback = JS( "function(row, data) {", "$(row).on('click', function() {", "var rowData = table.row(row).data();", "showGraph(rowData);", // Llama a la función showGraph con los datos de la fila "});", "}") )) }) }) ``` 6. Dentro de la función `showGraph`, podrás definir cómo se abrirá una ventana emergente y qué gráfico se mostrará. Aquí tienes un ejemplo básico utilizando la biblioteca 'plotly' para crear un gráfico de dispersión: ```R showGraph <- function(rowData) { popupContent <- fluidPage( tags$div(plotlyOutput("myPlot")) ) modalDialog(popupContent) output$myPlot <- renderPlotly({ plot_ly(data = rowData, x = ~x_variable, y = ~y_variable, mode = 'markers') }) showModal(modalDialog()) } ``` Con estas instrucciones, podrás abrir una ventana emergente y mostrar un gráfico que dependerá del evento de clic en una fila de la tabla DT en tu aplicación R Shiny. ¡Espero que esto te sea de ayuda!

Estoy tratando de crear una ventana emergente en función de un evento de clic en Shiny. La ventana debería abrirse cuando el usuario hace clic en una fila en una tabla DT. Debería contener un gráfico de plotly, filtrado por el elemento de fila en la columna “v1” en “df” (cuando se hace clic en una fila con “v1 == “B””, todas las filas con “v1 == “B”” se incluyen en el gráfico). Puedo crear todos los objetos (ver código), pero tengo dificultades con el filtro dependiente y la apertura de la ventana emergente basada en el evento de clic en la fila.

Soy nuevo en Shiny y he intentado implementar fragmentos de preguntas similares, pero no pude encontrar exactamente lo que necesito ni juntar todo.

library(shiny)
library(DT)
library(plotly)
library(dplyr)

id <- c(1:100)
v1 <- rep(LETTERS[1:10], times = 10)
v2 <- sample.int(100, 100)
v3 <- sample.int(200, 100)
v4 <- sample.int(300, 100)
v5 <- rep(c(2000:2019), times = 5)
df <- data.frame(id, v1, v2, v3, v4, v5)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    sidebarMenu(
      menuItem("first", tabName = "first"
      )
    )
  ),
  dashboardBody(
    tabItems(
      tabItem(
        tabName = "first",
        box(width = 12, solidHeader = TRUE,
            DT::dataTableOutput("table"),
            plotlyOutput("plot")
        )
      )
    )
  )
)

server <- function(input, output) {

  output$table <- DT::renderDataTable({
    DT::datatable(df,
                  options = list(
                    pageLength = 10, paging = TRUE, searching = TRUE
                  ),
                  rownames = FALSE, selection = "single",
    )
  })

  # table_subset <- reactive({
  #     df %>% filter(v1 == "B")
  # })

  click_subset <- df %>% filter(v1 == "B")

  #Plot in popup window
  output$plot <- renderPlotly({
    plot_ly(click_subset, type = 'bar') %>%
      add_trace(
        x =~v5, y =~v3
      ) 
  })
}

shinyApp(ui, server)
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear una ventana emergente en Shiny que se abra cuando el usuario hace clic en una fila de una tabla DT, puedes usar el siguiente código:

    “`{r}
    library(shiny)
    library(DT)
    library(plotly)
    library(dplyr)

    id <- c(1:100)
    v1 <- rep(LETTERS[1:10], times = 10)
    v2 <- sample.int(100, 100)
    v3 <- sample.int(200, 100)
    v4 <- sample.int(300, 100)
    v5 <- rep(c(2000:2019), times = 5)
    df <- data.frame(id, v1, v2, v3, v4, v5)

    ui <- dashboardPage(
    dashboardHeader(),
    dashboardSidebar(
    sidebarMenu(
    menuItem(“first”, tabName = “first”
    )
    )
    ),
    dashboardBody(
    tabItems(
    tabItem(
    tabName = “first”,
    box(width = 12, solidHeader = TRUE,
    DT::dataTableOutput(“table”)
    )
    ),
    # Ventana emergente
    tags$div(
    id = “modal”,
    class = “modal”,
    tags$div(
    id = “modal-content”,
    class = “modal-content”,
    tags$span(id = “close”, class = “close”, “x”),
    plotOutput(“popup_plot”)
    )
    )
    )
    )
    )

    server <- function(input, output) {

    output$table <- DT::renderDataTable({
    DT::datatable(df,
    options = list(
    pageLength = 10, paging = TRUE, searching = TRUE
    ),
    rownames = FALSE, selection = “single”,
    )
    })

    # Obtener datos para el gráfico emergente basado en la fila clicada
    output$popup_plot <- renderPlot({ req(input$clicked_row) row_data <- df[input$clicked_row,] filtered_data <- df %>% filter(v1 == row_data$v1)
    plot(filtered_data$v5, filtered_data$v3, type = “bar”)
    })

    # Abrir ventana emergente al hacer clic en la fila
    observeEvent(input$table_rows_selected, {
    output$popup_plot <- renderPlot({ clicked_row <- input$table_rows_selected req(clicked_row) row_data <- df[clicked_row,] filtered_data <- df %>% filter(v1 == row_data$v1)
    plot(filtered_data$v5, filtered_data$v3, type = “bar”)
    })
    showModal(“modal”)
    })

    # Cerrar ventana emergente al hacer clic en el botón de cierre
    observeEvent(input$close, {
    removeModal()
    })

    }

    shinyApp(ui, server)


    En este código, hemos agregado una ventana emergente que contendrá el gráfico de plotly, y hemos realizado algunos cambios en el código del servidor para responder al evento de clic en la fila y abrir la ventana emergente. La función `tags$div` se utiliza para crear la ventana emergente, con los argumentos `id` y `class` proporcionando identificadores únicos para la ventana emergente y su contenido. Se agrega una "X" en el contenido de la ventana emergente para proporcionar un botón de cierre, que se crea utilizando otra función `tags$span`. En el código del servidor, primero creamos una salida `popup_plot` que contendrá el gráfico filtrado de plotly para la fila clicada. La función `req` se utiliza para asegurarnos de que el valor de entrada de `clicked_row` no sea `NULL`. A continuación, creamos un observador que abrirá la ventana emergente al hacer clic en la fila. El valor `input$table_rows_selected` da la fila seleccionada por el usuario, que se utiliza para obtener los datos de la fila y filtrar el marco de datos para obtener el subconjunto de datos para la fila clicada. Luego renderizamos el `popup_plot` y usamos `showModal` para abrir la ventana emergente. Finalmente, creamos otro evento del observador que cierra la ventana emergente cuando se hace clic en el botón de cierre. En este evento, utilizamos la función `removeModal` para eliminar la ventana emergente de la interfaz de usuario. Nota que hemos eliminado el objeto `plotlyOutput` de `dashboardBody` y hemos incorporado la salida dentro de la ventana emergente. Nota: Hemos agregado código CSS para estilizar la ventana emergente. El código CSS es el siguiente: ```{css} /* Ventana Emergente */ .modal { display: none; /* Oculto por defecto */ position: fixed; /* Permanecer en su lugar */ z-index: 1; /* Situarse en la parte superior */ left: 0; top: 0; width: 100%; /* Ancho completo */ height: 100%; /* Altura completa */ overflow: auto; /* Activar desplazamiento si es necesario */ background-color: rgb(0, 0, 0); /* Color de respaldo */ background-color: rgba(0, 0, 0, 0.4); /* Negro con opacidad */ } /* Contenido/Caja de la Ventana Emergente */ .modal-content { background-color: #fefefe; margin: 15% auto; /* 15% desde la parte superior y centrado */ padding: 20px; border: 1px solid #888; width: 80%; /* Puede ser más o menos, dependiendo del tamaño de la pantalla */ } /* Botón de cierre */ .close { color: #aaa; float: right; font-size: 28px; font-weight: bold; } .close:hover, .close:focus { color: black; text-decoration: none; cursor: pointer; }

Comments are closed.