2017-06-01 1 views
0

J'essaie de coder en couleur chaque rangée d'une table en fonction des données de la colonne 2. Voir l'image ci-dessous.R Ligne de tableau de codes couleurs brillante en fonction du contenu des cellules

enter image description here

Fondamentalement, pour vous donner un exemple, le code doit travailler en fonction de la deuxième colonne, donc si elle estime que l'Afrique sub-saharienne par exemple, faire toute la ligne d'une certaine couleur, même pour l'Amérique latine et les Caraïbes mais avec une couleur différente. Il y a quelques autres colonnes à droite de la colonne Région. Je pense que je pourrais avoir besoin d'un certain nombre d'instructions if dans la fonction dataTable qui est ci-dessous, mais toute aide serait appréciée.

output$Composite <- renderDataTable(datatable(FVI_DATA_COMPOSITE, 
               options = list(
               columnDefs = list(list(className = 'dt-center', targets = 3:9)))) 
               %>% formatRound(c(3:9), 2)) 

Modifier: Nouveau bloc de code qui ne fonctionne pas actuellement.

output$Composite <- renderDataTable(datatable(FVI_DATA_COMPOSITE, 
               options = list(
               columnDefs = list(list(className = 'dt-center', targets = 3:9)), pageLength = 50, lengthChange = FALSE)) 
               %>% formatRound(c(3:9), 2)) 
               %>% formatStyle(0, target = "row", 
               backgroundColor = styleEqual(which(FVI_DATA_COMPOSITE$Region == "Sub-Saharan Africa")[1], "red")) 

Répondre

2

@GGamba était un peu plus rapide. Toutefois, il pourrait être intéressant pour vous, que vous pouvez formater en fait une ligne entière sans JS si vous utilisez l'ensemble du paramètre target = "row": vous

library(shiny) 
library(magrittr) 
library(DT) 
shinyApp(
    ui = fluidPage(
    fluidRow(
     column(12, 
      dataTableOutput('table') 
    ) 
    ) 
), 
    server = function(input, output) { 
    output$table <- renderDataTable({ 
     datatable(iris) %>% 
     formatStyle(0, target = "row", backgroundColor = styleEqual(which(iris$Sepal.Length < 5)[1], "red")) 
    }) 
    } 
) 
} 
+0

Merci, comment cela entrerait-il dans mon exemple de code? – OwlieW

+0

Vous pouvez apprendre de cela que vous devez toujours fournir une application complète et l'ensemble de données que vous utilisez. Ou tout autre exemple reproductible, ... Vous devrez remplacer la première valeur de la fonction 'styleEqual()' par les conditions de vos données, ... ou partager des exemples de données avec nous. – BigDataScientist

+0

Je ne peux pas partager les données exactes, mais permettez-moi d'ajouter le bloc de code que j'essaye d'obtenir le travail avec vos suggestions. Voir la question éditée – OwlieW

0

Pour Mise en forme conditionnelle d'une seule cellule se fait facilement avec un DT helper function:

library(DT) 
datatable(mtcars) %>% 
    formatStyle(0, 
       backgroundColor = styleEqual(c('Mazda RX4', 'Mazda RX4 Wag'), 
              c('green', 'red') 
       ) 
    ) 

forme conditionnellement une ligne entière, d'autre part, nous devons utiliser un certain JS dans l'option rowCallback.

Quelque chose le long de ces lignes:

library(DT) 
datatable(FVI_DATA_COMPOSITE, 
      options = list(
       rowCallback = JS('function(nRow, aData) {  
           if (aData[1] == "Sub-Saharan Africa") 
            $(nRow).css("background-color", "#9BF59B"); 
           if (aData[1] == "Latin America ") 
            $(nRow).css("background-color", "#yellow"); 
           }'), 
       columnDefs = list(list(className = 'dt-center', targets = 3:9)) 
     ) 
) %>% 
    formatRound(c(3:9), 2)) 
+0

Merci, peut ce code être utilisé tel quel, ou ai-je besoin changer quoi que ce soit. J'ai aussi essayé de le mettre en place, mais quand j'ai essayé d'ouvrir la table, je me suis contenté de dire le traitement. Aussi, importe-t-il que la première colonne soit le pays, et la deuxième est la région où nous vérifions l'application de la couleur. L'indice devrait-il être 2 au lieu de 1? – OwlieW

+0

Concernant votre première partie: Dans le cas où vous ne l'avez pas déjà vu, vous pouvez utiliser 'target =" row "' pour les lignes (voir l'autre article ci-dessus), ... – BigDataScientist

+1

J'ai vu et upvoted :) Je ne voulais pas mettre à jour ni supprimer ma réponse, il peut être utile dans les cas de bord (pas sûr de ce qui, mais ..) – GGamba