2017-10-20 12 views
1

J'ai une table de données que j'affiche avec DT. Dans deux colonnes, j'affiche des pourcentages et je veux afficher des barres de fond. Cependant le nombre de colonnes peut changer en fonction de la table choisie. Il y aura soit une ou deux colonnes de pourcentage.Erreur d'affichage de la table de données DT

Voici quelques données fictives et mon approche jusqu'à présent qui utilise grep sans succès.

a <- c(45, 143, 123, 120, 118, 109, 94, 81) 
b <- c(54, 132, 119, 113, 108, 104, 99, 91) 
a2 <- round(a/sum(a)*100,2) 
b2 <- round(b/sum(b)*100,2) 

dt <- data.table("Age" = c("-20", "20-30", "30-40", "40-50", 
          "50-60", "60-70", "70-80", "80+"), 
       "Group A" = a, 
       "Group A %" = a2, 
       "Group B" = b, 
       "Group B %" = b2) 


if(sample(c(0,1), 1)==1) x <- dt else x <- dt[ ,c(1:3)] 

DT::datatable(x, 
       rownames = FALSE, 
       extensions = c('FixedColumns'), 
       class = 'cell-border stripe', 
       options = list(dom = 't', 
          pageLength = nrow(x), 
          columnDefs = list(list(className = 'dt-center', targets = 0:(ncol(x)-1))) 
          ) 
      ) %>% 
    formatStyle(
    grep("%", colnames(x), value=TRUE), 
    background = styleColorBar(x[, .SD, .SDcols=grep("%", colnames(x), value=TRUE)], 'steelblue'), 
    backgroundSize = '50% 50%', 
    backgroundRepeat = 'no-repeat', 
    backgroundPosition = 'right') 

Malheureusement, cela crée l'erreur:

*Error in FUN(X[[i]], ...) : only defined on a data frame with all numeric variables* 

Alors, comment puis-je sélectionner dynamiquement les colonnes pour afficher les barres?

Toute aide très appréciée.

Répondre

1

Le problème provient de range() dans styleColorBar(), car il attend un vecteur numérique ou caractère.

Si vous transmettez uniquement les valeurs des colonnes que vous souhaitez appliquer, css fonctionnera. Vous pouvez utiliser styleColorBar = unlist(x[, .SD, .SDcols=grep("%", colnames(x), value=TRUE)]) pour faire exactement cela:

DT::datatable(x, 
       rownames = FALSE, 
       extensions = c('FixedColumns'), 
       class = 'cell-border stripe', 
       options = list(dom = 't', 
          pageLength = nrow(x), 
          columnDefs = list(list(className = 'dt-center', targets = 0:(ncol(x)-1))) 
      ) 
) %>% 
    formatStyle(
    columns = grep("%", colnames(x), value=TRUE), 
    background = styleColorBar(unlist(x[, .SD, .SDcols=grep("%", colnames(x), value=TRUE)]), 'steelblue'), 
    backgroundSize = '50% 50%', 
    backgroundRepeat = 'no-repeat', 
    backgroundPosition = 'right') 

Cela renverra

enter image description here

+0

parfaite et sans grande réécriture. Je vous remercie. –