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.

Agregar, remover y editar filas en un DT::datatable de una aplicación shiny.

Tengo la aplicación brillante que se muestra a continuación en la que puedo agregar una nueva fila presionando Añadir basado en la selección de los widgets brillantes. Puedo seleccionar y eliminar una fila presionando Eliminar y quiero combinar con ellos la funcionalidad de hacer clic en una fila y luego cambiar el valor de una columna seleccionada de esta fila por el widget relativo en la barra lateral izquierda después de presionar Editar. Por ejemplo, si hago clic en la segunda fila y luego cambio el widget Tipo de seguridad de Acciones a Fondo de carga, la columna Tipo de seguridad de la segunda fila debería convertirse en Fondo de carga.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para implementar la funcionalidad de editar una fila seleccionada en la aplicación Shiny, podemos seguir los siguientes pasos:

    1. Definir un valor reactivo row_selected en la función del servidor para realizar un seguimiento de la fila seleccionada por el usuario.
    2. Agregar un nuevo bloque observeEvent() para el botón input$edit para verificar si se ha seleccionado una fila en la tabla (input$TBL1_rows_selected no es nulo). Si se selecciona una fila, guardar el índice de la fila seleccionada en row_selected.
    3. Crear un botón de acción para guardar los datos editados.
    4. Definir un nuevo bloque observeEvent() para el botón ‘guardar’ que verifica si alguna fila está seleccionada (row_selected no es nulo) y actualiza los valores de la tabla de datos con los valores de los widgets de entrada en la barra lateral.
    5. Actualizar el bloque renderDataTable() para mostrar una fila resaltada cuando se selecciona.

    Aquí está el código actualizado:

    library(shiny)
    library(shinydashboard)
    library(shinydashboardPlus)
    library(DT)
    library(tibble)
    Input <- structure(list(`Security Type` = c("Stock", "Stock", "Load Fund"), Ticker = c("XOM", "NFLX", "AMCPX"), `Purchase Date` = structure(c(
      16070,
      17084, 17084
    ), class = "Date"), `Sale Date` = structure(c(
      18627,
      NA, 18545
    ), class = "Date"), `Amount Invested` = c(
      "$10,000",
      "$8,000", "$10,000"
    )), class = c(
      "spec_tbl_df", "tbl_df", "tbl",
      "data.frame"
    ), row.names = c(NA, -3L))
    
    shinyApp(
      ui = tags$body(class = "skin-blue sidebar-mini control-sidebar-open", dashboardPage(
        options = list(sidebarExpandOnHover = TRUE),
        header = dashboardHeader(title = "Investment Advisor Monitoring - Insider Trading", titleWidth = 450),
        sidebar = dashboardSidebar(
          minified = F, collapsed = F,
          selectInput(
            "sectype", "Security Type",
            c(unique(Input$`Security Type`))
          ),
          selectInput(
            "sectick", "Ticker",
            c(unique(Input$Ticker))
          ),
          dateInput("PurDate", "Purchase Date", value = as.Date("2013-12-31")),
          dateInput("selDate", "Sale Date", value = as.Date("2019-01-31")),
          selectInput(
            "aminv", "Amount Invested",
            c(unique(Input$`Amount Invested`))
          ),
          actionButton("add", "Add"),
          actionButton("edit", "Edit"),
          actionButton("save", "Save Changes"),
          actionButton("deleteRows", "Delete Rows")
        ),
        body = dashboardBody(
          h3("Results"),
          tabsetPanel(
            id = "tabs",
            tabPanel(
              "InsiderTraining",
              dataTableOutput("TBL1")
            )
          )
        ),
        controlbar = dashboardControlbar(width = 300),
        title = "DashboardPage"
      )),
      server = function(input, output) {
        # Iniciar con algunos datos de ejemplo
        data <- reactiveVal(Input)
        row_selected <- reactiveVal(NULL)
    
        observeEvent(
          input$add,
          {
            # empezar con los datos actuales
            data() %>%
              add_row(
                `Security Type` = isolate(input$sectype),
                Ticker = isolate(input$sectick),
                `Purchase Date` = isolate(input$PurDate),
                `Sale Date` = isolate(input$selDate),
                `Amount Invested` = isolate(input$aminv)
              ) %>%
              # actualizar el valor de datos
              data()
          }
        )
    
        observeEvent(input$deleteRows,{
    
          if (!is.null(input$TBL1_rows_selected)) {
            data(data()[-as.numeric(input$TBL1_rows_selected),])
    
          }
        })
    
        observeEvent(input$edit,{
          if (!is.null(input$TBL1_rows_selected)) {
            # recordar la fila seleccionada
            row_selected(input$TBL1_rows_selected)
          }
        })
    
        observeEvent(input$save,{
          if (!is.null(row_selected())){
            # obtener el índice de la fila seleccionada
            idx <- row_selected()
            # actualizar los valores para la fila seleccionada
            data()[idx,"Security Type"] <<- input$sectype
            data()[idx,"Ticker"] <<- input$sectick
            data()[idx,"Purchase Date"] <<- input$PurDate
            data()[idx,"Sale Date"] <<- input$selDate
            data()[idx,"Amount Invested"] <<- input$aminv
    
            # limpiar row_selected
            row_selected(NULL)
          }
        })
    
        output$TBL1 <- renderDataTable({
          # resalta la fila seleccionada
          selected_rows <- if (!is.null(row_selected())) row_selected() else NULL
          datatable(data(), selection = list(mode = 'single', selected = selected_rows))
        })
      }
    )
    

Comments are closed.