2017-03-03 5 views
1

Ich versuche, das DT gemäß den Werten aus der vorherigen Tabelle zu formatieren. Zum Beispiel möchte ich anzeigen, wenn etwas erhöht, verringert oder gleich geblieben ist. Ich könnte dies mit Kable tun, aber konnte nicht den nächsten Schritt, wo ich eine Zelle Clik und zeigen Sie alle Daten zu diesem Wert in einem anderen DT.Formatieren Sie die Farbe der glänzenden Datentabelle (DT) entsprechend den Werten in einem anderen Datensatz

library(shiny) 
library(DT) 
library(dplyr) 
ui <- fluidPage(
    mainPanel(
     dataTableOutput("iris_head") 
) 
) 

server <- function(input, output) { 

    #df_data <- iris 

    df_data <- head(iris[-5]) 

    # Just a dataset describing if iris has changed over a month 
    # If reference data is of the same size as the original data (df_data). 
    # If reference data is negative I want the cell in the df_data to be green; 
    # If zero blue and if positive then green. 
    # I can make changes with ranges within the current range, can we get the color encoding from another table? 
    # set the seed 
    set.seed(42) 
    reference_df <- (sapply(df_data, function(x) jitter(x, amount = 2)) - df_data) %>% 
    round(. , digits = 0) 

    print(reference_df) 


    output$iris_head <- renderDataTable(datatable(df_data, selection = "single")%>% 
             formatStyle('Sepal.Width', 
                color = styleInterval(c(3.4, 3.8), c('green', 'blue', 'red')), 
                backgroundColor = styleInterval(3.4, c('gray', 'yellow'))) %>% 
             formatString('Sepal.Width', suffix = '<font color="red">&uArr; </font>')) 


} 

shinyApp(ui = ui, server = server) 

Die reference_df in diesem Fall:

Sepal.Length Sepal.Width Petal.Length Petal.Width 
     2   1   2   0 
     2   -1   -1   0 
     -1   1   0   2 
     1   1   2   -1 
     1   0   2   2 
     0   1   -2   2 

Die erforderliche Ausgabe wird in der Figur gezeigt, wo ich will auch den Text färben und wenn möglich den Hintergrund entsprechend den Werten in reference_df.

enter image description here

Antwort

3

Für die Textfarbe Teil, könnten Sie es mit formatStyle tun, aber Sie würden die df_data und reference_df, dann gibt sie an datatable und ändern Sie die Art der Spalten 1 bis 4 basierend auf dem Wert zu cbind brauchen der Spalten 5 bis 8:

datatable(cbind(df_data,reference_df), selection = "single", 
               options=list(columnDefs = list(list(visible=FALSE, targets=c(5:8)))))%>% 
             formatStyle(1:4, valueColumns=5:8, 
                color = JS("value < 0 ? 'red' : value > 0 ? 'green' : 'blue'")) 

Der columnDefs-Teil verbirgt die letzten 4 Spalten.

Sie können nicht formatString basieren auf Werten, so dass, wenn Sie auf die Pfeile hinzufügen möchten, können Sie df_data ändern könnte die Farben und die Pfeile hinzufügen, bevor es zu datatable vorbei:

for(col in 1:dim(df_data)[2]){ 
    df_data[col] <- mapply(function(i,j){ 
     ifelse(i > 0, paste0("<span style='color:red'>",j,"<font>&uArr; </font></span>"), 
      ifelse(i<0, paste0("<span style='color:green'>",j,"<font>&dArr; </font></span>"), 
        paste0("<span style='color:blue'>",j,"<font>&hArr; </font></span>"))) 
    },reference_df[col],df_data[col]) 
    } 

    output$iris_head <- renderDataTable(
    datatable(df_data, selection = "single",escape = F) 
    ) 

Diese Schleifen durch die Werte von df_data und ändert sie in Abhängigkeit von den Werten reference_df. Sie benötigen escape=F als Argument im Aufruf datatable, um HTML-Escaping zu verhindern.

Sie können mehr CSS-Styling in den span-Tags hinzufügen, wenn Sie den Hintergrund etc.

+0

Dank färben möchten! für eine sehr gut erklärte Antwort. Etwas merkwürdig, dass jemand diese Frage ohne Kommentar wegen der Tatsache, dass er eine so gute Antwort erhalten hat, abgelehnt hat. – discipulus

Verwandte Themen