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.

Cómo agregar argumentos a un DT:datatable basándose en algunas condiciones if?

Estoy tratando de dar formato a una tabla en shiny usando DT::datatable. Todas mis tablas pueden tener el contenedor predeterminado, pero solo cuando paso el argumento de contenedor es cuando quiero que sea diseñado como se pasa. He intentado varias opciones de usar condiciones if, pero sin éxito. Cuando miré el código de datatable, dice que si la función del contenedor falta, toma un tipo predeterminado. También intenté forzar lo mismo pero aún me da un error.

Ayuda por favor. A continuación se muestra el código para lo mismo:

table_opt = function(x, edit_y, container_dat = NULL, form_type = "", col_list = NULL){

  DT::renderDataTable({

####### Formato porcentual

if(form_type == "%")
  {
    datatable(x
    ,editable = edit_y
    ,if(is.null(container_dat)){container = expr()} else {container = container_dat}
  ,rownames = F
  ,options = list(
    paging = F
  ,ordering = F
  ,searching = F
  ,deferRender = T
  ,class = "compact"
  ,headerCallback = JS(
    "function(thead) {",
    "$(thead).css('font-size','14px');",
    "$(thead).css('background-color','#000000');",
    "$(thead).css('color','#ffffff');",
    "}"
  ,columnDefs = list(list(className = 'dt-center', targets = '_all'))
)) %>% 
  formatPercentage(col_list,digits = 2)
}
})
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la declaración de la condición de la instrucción if dentro de la función renderDataTable. La línea if(is.null(container_dat)){container = expr()} else {container = container_dat} no está manejando correctamente el argumento de contenedor.

    Aquí está el código corregido:

    table_opt = function(x, edit_y, container_dat = NULL, form_type = "", col_list = NULL){
    
      DT::renderDataTable({
    
        ####### Formato porcentaje
    
        if(form_type == "%")
        {
          container <- if(!is.null(container_dat)) {container_dat} else {NULL}
          datatable(x
                    ,editable = edit_y
                    ,container = container
                    ,rownames = F
                    ,options = list(
                      paging = F
                      ,ordering = F
                      ,searching = F
                      ,deferRender = T
                      ,class = "compact"
                      ,headerCallback = JS(
                        "function(thead) {",
                        "$(thead).css('font-size','14px');",
                        "$(thead).css('background-color','#000000');",
                        "$(thead).css('color','#ffffff');",
                        "}"
                      ,columnDefs = list(list(className = 'dt-center', targets = '_all'))
                    )) %>%
          formatPercentage(col_list,digits = 2)
        } else {
          container <- if(!is.null(container_dat)) {container_dat} else {expr()}
          datatable(x
                    ,editable = edit_y
                    ,container = container
                    ,rownames = F
                    ,options = list(
                      paging = F
                      ,ordering = F
                      ,searching = F
                      ,deferRender = T
                      ,class = "compact"
                      ,headerCallback = JS(
                        "function(thead) {",
                        "$(thead).css('font-size','14px');",
                        "$(thead).css('background-color','#000000');",
                        "$(thead).css('color','#ffffff');",
                        "}"
                      )
                      ,columnDefs = list(list(className = 'dt-center', targets = '_all'))
                    ))
        }
      })
    }
    

    En este código, he separado los casos en que se suministra container_dat y cuando no se suministra. Esto debería ayudar a seleccionar el argumento de contenedor dinámicamente. Además, he agregado un caso para cuando form_type no es %, para cubrir el comportamiento predeterminado.

Comments are closed.