Estoy decidido a aprender R-Shiny, para esto estoy tratando de implementar una tabla editable usando el paquete DT, que lee y escribe las ediciones en una base de datos usando el paquete RSQLite, y esto realmente funciona, así que excluyo esta parte del código del ejemplo a continuación para mejorar drásticamente la legibilidad.
Puedo escribir las ediciones con el enfoque sugerido en el sitio web brillante https://rstudio.github.io/DT/shiny.html que enlaza con los ejemplos en esta página https://yihui.shinyapps.io/DT- editar/ .
Con el siguiente código de código, una vez que edito una celda en línea, puedo imprimir un par de líneas de depuración y usar la función dbExecute() puedo enviar la edición a la base de datos.
observeEvent(input$data_cell_edit, { info = input$data_cell_edit str(info) print(info) print("Edit Triggered") #Here I write my edits }Ahora también me gustaría agregar un menú desplegable para editar columnas factoriales, por lo que sugerí seguir el enfoque sugerido en esta respuesta , mostrar el menú desplegable para una sola columna en DT brillante.
Usando el javascript a continuación, puedo reemplazar las celdas con el menú desplegable correspondiente. Sin embargo, el problema aquí es que una vez que se realiza una edición a través del menú desplegable, el evento data_cell_edit no se activa, por lo que no se puede realizar la actualización de la base de datos.
Si bien una opción podría ser encerrar la escritura en la base de datos directamente en el código javascript, la mejor manera para mí sería mejorar ese javascript para activar la devolución de llamada data_cell_edit de alguna manera.
¿Es esto posible en absoluto? Además, por algunas razones
library(shiny) library(DT) ui <- fluidPage( DT::dataTableOutput('foo'), verbatimTextOutput('sel') ) server <- function(input, output, session) { data <- head(iris, 5) for (i in 1:nrow(data)) { data$species_selector[i] <- as.character(selectInput(paste0("sel", i), "", choices = unique(iris$Species), width = "100px")) } output$foo = DT::renderDataTable( data, escape = FALSE, editable=TRUE, callback = JS("table.rows().every(function(i, tab, row) { var $this = $(this.node()); $this.attr('id', this.data()[0]); $this.addClass('shiny-input-container'); }); Shiny.unbindAll(table.table().node()); Shiny.bindAll(table.table().node());") ) observeEvent(input$foo_cell_edit, { info = input$foo_cell_edit print("event triggered") #Here I write my edits }) } shinyApp(ui, server)tldr:
con el código anterior, cuando edito una celda normal, activo el evento que escribe "evento activado" en la consola.
cuando edito una celda con el menú desplegable, este evento no se activa.
¿Cómo puedo desencadenar ese evento?