Displaying commas and conditional highlighting in Rshiny - not compatible











up vote
0
down vote

favorite












I have a Shiny app rendering a datatable within which I would like to incorporate 2 conditional formatting features




  1. Add commas to numbers greater than 1000

  2. Apply blue background to column 2 values when values column 2 values are >= 1.3x values in column 1. Apply red background when column 2 values are <= .7x values in column 1.


I asked a question about how to incorporate commas in this SO post. I I remove the rowcallback argument in the script below, the commas render properly. Similarly, if I comment out the dom and formatCurrency arguments, the highlighting conditional fomatting renders properly, as well.



  js_cont_var_lookup <- reactive({
JS(
'function(nRow, aData) {
for (i=2; i < 3; i++) {
if (parseFloat(aData[i]) > aData[1]*(1.03)) {
$("td:eq(" + i + ")", nRow).css("background-color", "aqua");
}
}
for (i=2; i < 3; i++) {
if (parseFloat(aData[i]) < aData[1]*(.7)) {
$("td:eq(" + i + ")", nRow).css("background-color", "red");
}
}
}'
) # close JS
})

shinyApp(
ui = fluidPage(
DTOutput("dummy_data_table")
),
server = function(input, output) {
output$dummy_data_table <- DT::renderDataTable(
data.frame(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000)) %>%
datatable(extensions = 'Buttons',
options = list(
pageLength = 50,
scrollX=TRUE,
dom = 'T<"clear">lBfrtip',
rowCallback = js_cont_var_lookup()
)
) %>%
formatCurrency(1:2, currency = "", interval = 3, mark = ",")
) # close renderDataTable
}
)


However, when I leave both in, the datatable hangs with a 'Processing' message.










share|improve this question















This question has an open bounty worth +50
reputation from matsuo_basho ending in 3 days.


Looking for an answer drawing from credible and/or official sources.




















    up vote
    0
    down vote

    favorite












    I have a Shiny app rendering a datatable within which I would like to incorporate 2 conditional formatting features




    1. Add commas to numbers greater than 1000

    2. Apply blue background to column 2 values when values column 2 values are >= 1.3x values in column 1. Apply red background when column 2 values are <= .7x values in column 1.


    I asked a question about how to incorporate commas in this SO post. I I remove the rowcallback argument in the script below, the commas render properly. Similarly, if I comment out the dom and formatCurrency arguments, the highlighting conditional fomatting renders properly, as well.



      js_cont_var_lookup <- reactive({
    JS(
    'function(nRow, aData) {
    for (i=2; i < 3; i++) {
    if (parseFloat(aData[i]) > aData[1]*(1.03)) {
    $("td:eq(" + i + ")", nRow).css("background-color", "aqua");
    }
    }
    for (i=2; i < 3; i++) {
    if (parseFloat(aData[i]) < aData[1]*(.7)) {
    $("td:eq(" + i + ")", nRow).css("background-color", "red");
    }
    }
    }'
    ) # close JS
    })

    shinyApp(
    ui = fluidPage(
    DTOutput("dummy_data_table")
    ),
    server = function(input, output) {
    output$dummy_data_table <- DT::renderDataTable(
    data.frame(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000)) %>%
    datatable(extensions = 'Buttons',
    options = list(
    pageLength = 50,
    scrollX=TRUE,
    dom = 'T<"clear">lBfrtip',
    rowCallback = js_cont_var_lookup()
    )
    ) %>%
    formatCurrency(1:2, currency = "", interval = 3, mark = ",")
    ) # close renderDataTable
    }
    )


    However, when I leave both in, the datatable hangs with a 'Processing' message.










    share|improve this question















    This question has an open bounty worth +50
    reputation from matsuo_basho ending in 3 days.


    Looking for an answer drawing from credible and/or official sources.


















      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I have a Shiny app rendering a datatable within which I would like to incorporate 2 conditional formatting features




      1. Add commas to numbers greater than 1000

      2. Apply blue background to column 2 values when values column 2 values are >= 1.3x values in column 1. Apply red background when column 2 values are <= .7x values in column 1.


      I asked a question about how to incorporate commas in this SO post. I I remove the rowcallback argument in the script below, the commas render properly. Similarly, if I comment out the dom and formatCurrency arguments, the highlighting conditional fomatting renders properly, as well.



        js_cont_var_lookup <- reactive({
      JS(
      'function(nRow, aData) {
      for (i=2; i < 3; i++) {
      if (parseFloat(aData[i]) > aData[1]*(1.03)) {
      $("td:eq(" + i + ")", nRow).css("background-color", "aqua");
      }
      }
      for (i=2; i < 3; i++) {
      if (parseFloat(aData[i]) < aData[1]*(.7)) {
      $("td:eq(" + i + ")", nRow).css("background-color", "red");
      }
      }
      }'
      ) # close JS
      })

      shinyApp(
      ui = fluidPage(
      DTOutput("dummy_data_table")
      ),
      server = function(input, output) {
      output$dummy_data_table <- DT::renderDataTable(
      data.frame(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000)) %>%
      datatable(extensions = 'Buttons',
      options = list(
      pageLength = 50,
      scrollX=TRUE,
      dom = 'T<"clear">lBfrtip',
      rowCallback = js_cont_var_lookup()
      )
      ) %>%
      formatCurrency(1:2, currency = "", interval = 3, mark = ",")
      ) # close renderDataTable
      }
      )


      However, when I leave both in, the datatable hangs with a 'Processing' message.










      share|improve this question













      I have a Shiny app rendering a datatable within which I would like to incorporate 2 conditional formatting features




      1. Add commas to numbers greater than 1000

      2. Apply blue background to column 2 values when values column 2 values are >= 1.3x values in column 1. Apply red background when column 2 values are <= .7x values in column 1.


      I asked a question about how to incorporate commas in this SO post. I I remove the rowcallback argument in the script below, the commas render properly. Similarly, if I comment out the dom and formatCurrency arguments, the highlighting conditional fomatting renders properly, as well.



        js_cont_var_lookup <- reactive({
      JS(
      'function(nRow, aData) {
      for (i=2; i < 3; i++) {
      if (parseFloat(aData[i]) > aData[1]*(1.03)) {
      $("td:eq(" + i + ")", nRow).css("background-color", "aqua");
      }
      }
      for (i=2; i < 3; i++) {
      if (parseFloat(aData[i]) < aData[1]*(.7)) {
      $("td:eq(" + i + ")", nRow).css("background-color", "red");
      }
      }
      }'
      ) # close JS
      })

      shinyApp(
      ui = fluidPage(
      DTOutput("dummy_data_table")
      ),
      server = function(input, output) {
      output$dummy_data_table <- DT::renderDataTable(
      data.frame(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000)) %>%
      datatable(extensions = 'Buttons',
      options = list(
      pageLength = 50,
      scrollX=TRUE,
      dom = 'T<"clear">lBfrtip',
      rowCallback = js_cont_var_lookup()
      )
      ) %>%
      formatCurrency(1:2, currency = "", interval = 3, mark = ",")
      ) # close renderDataTable
      }
      )


      However, when I leave both in, the datatable hangs with a 'Processing' message.







      javascript r shiny






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 5 at 17:52









      matsuo_basho

      504827




      504827






      This question has an open bounty worth +50
      reputation from matsuo_basho ending in 3 days.


      Looking for an answer drawing from credible and/or official sources.








      This question has an open bounty worth +50
      reputation from matsuo_basho ending in 3 days.


      Looking for an answer drawing from credible and/or official sources.


























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          Here is a soution avoiding the rowCallback:



          library(shiny)
          library(DT)
          library(data.table)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.table(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000))
          myWorkData <- copy(myDisplayData)
          myWorkData[, colors := ifelse(B >= A*1.03, 'rgb(0,255,255)', 'rgb(255, 255, 255)')]
          myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(B <= A*.7, 'rgb(255, 0, 0)', 'rgb(255, 255, 255)')]

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip'
          )
          ) %>% formatStyle('B', target = 'cell', backgroundColor = styleEqual(myDisplayData$B, myWorkData$colors)) %>%
          formatCurrency(1:2, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )



          1. Edit -------------------------


          If you prefer using a data.frame:



          library(shiny)
          library(DT)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.frame(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000))

          MyColors <- vector(mode = 'character', length = 0L)

          for (i in seq(nrow(myDisplayData))) {
          A <- myDisplayData$A[i]
          B <- myDisplayData$B[i]
          if (B >= A * 1.03) {
          MyColors[i] <- 'rgb(0,255,255)'
          } else if (B <= A * .7) {
          MyColors[i] <- 'rgb(255, 0, 0)'
          }
          else{
          MyColors[i] <- 'rgb(255, 255, 255)'
          }
          }

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip'
          )
          ) %>% formatStyle('B', target = 'cell', backgroundColor = styleEqual(myDisplayData$B, MyColors)) %>%
          formatCurrency(1:2, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )



          1. Edit -------------------------


          Here is a multi-column approach making the assumption, that all other columns are refering to column "A":



          library(shiny)
          library(DT)
          library(data.table)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.table(replicate(15,sample(round(runif(20,0,300000)), 20, rep=TRUE)))
          names(myDisplayData) <- LETTERS[1:15]
          referenceCol <- "A"
          targetColumns <- names(myDisplayData)[!names(myDisplayData) %in% referenceCol]
          myDisplayData[, index := seq(.N)]

          rowUniqueCols <- paste0("rowUnique", targetColumns)

          for(i in seq(rowUniqueCols)){
          myDisplayData[, (rowUniqueCols[i]) := do.call(paste,c(.SD, sep = "_")), .SDcols=c("index", targetColumns[i])]
          }

          myWorkData <- melt.data.table(myDisplayData, id.vars=c("index", referenceCol), measure.vars = rowUniqueCols)
          myDisplayData[, index := NULL]
          HideCols <- which(names(myDisplayData) %in% rowUniqueCols)
          setnames(myWorkData, "value", "rowUniqueValue")
          myWorkData[, value := as.numeric(sapply(strsplit(rowUniqueValue, "_"), "[[", 2))]
          myWorkData[, variable := NULL]
          myWorkData[, colors := ifelse(value >= .SD*1.3, 'rgb(0,255,255)', 'rgb(255, 255, 255)'), .SDcols=referenceCol]
          myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(value <= .SD*.7, 'rgb(255, 0, 0)', 'rgb(255, 255, 255)'), .SDcols=referenceCol]

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip',
          columnDefs = list(list(visible=FALSE, targets=HideCols))
          )
          ) %>% formatStyle(columns = targetColumns, valueColumns = rowUniqueCols, target = 'cell', backgroundColor = styleEqual(myWorkData$rowUniqueValue, myWorkData$colors)) %>%
          formatCurrency(1:15, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )


          Result:
          Result table






          share|improve this answer























          • This is great, thank you. One important point - I may have up to 15 columns (I just included 2 in my example for simplicity). So I would need to retain the for loop as in my example. How would that look?
            – matsuo_basho
            2 days ago










          • Are all other columns still refering to the first column regarding the color assignment?
            – ismirsehregal
            2 days ago










          • Please see my second edit.
            – ismirsehregal
            2 days ago










          • Btw: in your question you are mentioning 1.3x but in your JS function it's 1.03. I made it 1.3 in my code now.
            – ismirsehregal
            2 days ago






          • 1




            Just updated my 2. Edit. Now the colors are refering to row-unique helper columns. It's now fully working - please check.
            – ismirsehregal
            6 hours ago











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














           

          draft saved


          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53159633%2fdisplaying-commas-and-conditional-highlighting-in-rshiny-not-compatible%23new-answer', 'question_page');
          }
          );

          Post as a guest
































          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          0
          down vote













          Here is a soution avoiding the rowCallback:



          library(shiny)
          library(DT)
          library(data.table)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.table(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000))
          myWorkData <- copy(myDisplayData)
          myWorkData[, colors := ifelse(B >= A*1.03, 'rgb(0,255,255)', 'rgb(255, 255, 255)')]
          myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(B <= A*.7, 'rgb(255, 0, 0)', 'rgb(255, 255, 255)')]

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip'
          )
          ) %>% formatStyle('B', target = 'cell', backgroundColor = styleEqual(myDisplayData$B, myWorkData$colors)) %>%
          formatCurrency(1:2, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )



          1. Edit -------------------------


          If you prefer using a data.frame:



          library(shiny)
          library(DT)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.frame(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000))

          MyColors <- vector(mode = 'character', length = 0L)

          for (i in seq(nrow(myDisplayData))) {
          A <- myDisplayData$A[i]
          B <- myDisplayData$B[i]
          if (B >= A * 1.03) {
          MyColors[i] <- 'rgb(0,255,255)'
          } else if (B <= A * .7) {
          MyColors[i] <- 'rgb(255, 0, 0)'
          }
          else{
          MyColors[i] <- 'rgb(255, 255, 255)'
          }
          }

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip'
          )
          ) %>% formatStyle('B', target = 'cell', backgroundColor = styleEqual(myDisplayData$B, MyColors)) %>%
          formatCurrency(1:2, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )



          1. Edit -------------------------


          Here is a multi-column approach making the assumption, that all other columns are refering to column "A":



          library(shiny)
          library(DT)
          library(data.table)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.table(replicate(15,sample(round(runif(20,0,300000)), 20, rep=TRUE)))
          names(myDisplayData) <- LETTERS[1:15]
          referenceCol <- "A"
          targetColumns <- names(myDisplayData)[!names(myDisplayData) %in% referenceCol]
          myDisplayData[, index := seq(.N)]

          rowUniqueCols <- paste0("rowUnique", targetColumns)

          for(i in seq(rowUniqueCols)){
          myDisplayData[, (rowUniqueCols[i]) := do.call(paste,c(.SD, sep = "_")), .SDcols=c("index", targetColumns[i])]
          }

          myWorkData <- melt.data.table(myDisplayData, id.vars=c("index", referenceCol), measure.vars = rowUniqueCols)
          myDisplayData[, index := NULL]
          HideCols <- which(names(myDisplayData) %in% rowUniqueCols)
          setnames(myWorkData, "value", "rowUniqueValue")
          myWorkData[, value := as.numeric(sapply(strsplit(rowUniqueValue, "_"), "[[", 2))]
          myWorkData[, variable := NULL]
          myWorkData[, colors := ifelse(value >= .SD*1.3, 'rgb(0,255,255)', 'rgb(255, 255, 255)'), .SDcols=referenceCol]
          myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(value <= .SD*.7, 'rgb(255, 0, 0)', 'rgb(255, 255, 255)'), .SDcols=referenceCol]

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip',
          columnDefs = list(list(visible=FALSE, targets=HideCols))
          )
          ) %>% formatStyle(columns = targetColumns, valueColumns = rowUniqueCols, target = 'cell', backgroundColor = styleEqual(myWorkData$rowUniqueValue, myWorkData$colors)) %>%
          formatCurrency(1:15, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )


          Result:
          Result table






          share|improve this answer























          • This is great, thank you. One important point - I may have up to 15 columns (I just included 2 in my example for simplicity). So I would need to retain the for loop as in my example. How would that look?
            – matsuo_basho
            2 days ago










          • Are all other columns still refering to the first column regarding the color assignment?
            – ismirsehregal
            2 days ago










          • Please see my second edit.
            – ismirsehregal
            2 days ago










          • Btw: in your question you are mentioning 1.3x but in your JS function it's 1.03. I made it 1.3 in my code now.
            – ismirsehregal
            2 days ago






          • 1




            Just updated my 2. Edit. Now the colors are refering to row-unique helper columns. It's now fully working - please check.
            – ismirsehregal
            6 hours ago















          up vote
          0
          down vote













          Here is a soution avoiding the rowCallback:



          library(shiny)
          library(DT)
          library(data.table)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.table(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000))
          myWorkData <- copy(myDisplayData)
          myWorkData[, colors := ifelse(B >= A*1.03, 'rgb(0,255,255)', 'rgb(255, 255, 255)')]
          myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(B <= A*.7, 'rgb(255, 0, 0)', 'rgb(255, 255, 255)')]

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip'
          )
          ) %>% formatStyle('B', target = 'cell', backgroundColor = styleEqual(myDisplayData$B, myWorkData$colors)) %>%
          formatCurrency(1:2, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )



          1. Edit -------------------------


          If you prefer using a data.frame:



          library(shiny)
          library(DT)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.frame(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000))

          MyColors <- vector(mode = 'character', length = 0L)

          for (i in seq(nrow(myDisplayData))) {
          A <- myDisplayData$A[i]
          B <- myDisplayData$B[i]
          if (B >= A * 1.03) {
          MyColors[i] <- 'rgb(0,255,255)'
          } else if (B <= A * .7) {
          MyColors[i] <- 'rgb(255, 0, 0)'
          }
          else{
          MyColors[i] <- 'rgb(255, 255, 255)'
          }
          }

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip'
          )
          ) %>% formatStyle('B', target = 'cell', backgroundColor = styleEqual(myDisplayData$B, MyColors)) %>%
          formatCurrency(1:2, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )



          1. Edit -------------------------


          Here is a multi-column approach making the assumption, that all other columns are refering to column "A":



          library(shiny)
          library(DT)
          library(data.table)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.table(replicate(15,sample(round(runif(20,0,300000)), 20, rep=TRUE)))
          names(myDisplayData) <- LETTERS[1:15]
          referenceCol <- "A"
          targetColumns <- names(myDisplayData)[!names(myDisplayData) %in% referenceCol]
          myDisplayData[, index := seq(.N)]

          rowUniqueCols <- paste0("rowUnique", targetColumns)

          for(i in seq(rowUniqueCols)){
          myDisplayData[, (rowUniqueCols[i]) := do.call(paste,c(.SD, sep = "_")), .SDcols=c("index", targetColumns[i])]
          }

          myWorkData <- melt.data.table(myDisplayData, id.vars=c("index", referenceCol), measure.vars = rowUniqueCols)
          myDisplayData[, index := NULL]
          HideCols <- which(names(myDisplayData) %in% rowUniqueCols)
          setnames(myWorkData, "value", "rowUniqueValue")
          myWorkData[, value := as.numeric(sapply(strsplit(rowUniqueValue, "_"), "[[", 2))]
          myWorkData[, variable := NULL]
          myWorkData[, colors := ifelse(value >= .SD*1.3, 'rgb(0,255,255)', 'rgb(255, 255, 255)'), .SDcols=referenceCol]
          myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(value <= .SD*.7, 'rgb(255, 0, 0)', 'rgb(255, 255, 255)'), .SDcols=referenceCol]

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip',
          columnDefs = list(list(visible=FALSE, targets=HideCols))
          )
          ) %>% formatStyle(columns = targetColumns, valueColumns = rowUniqueCols, target = 'cell', backgroundColor = styleEqual(myWorkData$rowUniqueValue, myWorkData$colors)) %>%
          formatCurrency(1:15, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )


          Result:
          Result table






          share|improve this answer























          • This is great, thank you. One important point - I may have up to 15 columns (I just included 2 in my example for simplicity). So I would need to retain the for loop as in my example. How would that look?
            – matsuo_basho
            2 days ago










          • Are all other columns still refering to the first column regarding the color assignment?
            – ismirsehregal
            2 days ago










          • Please see my second edit.
            – ismirsehregal
            2 days ago










          • Btw: in your question you are mentioning 1.3x but in your JS function it's 1.03. I made it 1.3 in my code now.
            – ismirsehregal
            2 days ago






          • 1




            Just updated my 2. Edit. Now the colors are refering to row-unique helper columns. It's now fully working - please check.
            – ismirsehregal
            6 hours ago













          up vote
          0
          down vote










          up vote
          0
          down vote









          Here is a soution avoiding the rowCallback:



          library(shiny)
          library(DT)
          library(data.table)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.table(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000))
          myWorkData <- copy(myDisplayData)
          myWorkData[, colors := ifelse(B >= A*1.03, 'rgb(0,255,255)', 'rgb(255, 255, 255)')]
          myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(B <= A*.7, 'rgb(255, 0, 0)', 'rgb(255, 255, 255)')]

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip'
          )
          ) %>% formatStyle('B', target = 'cell', backgroundColor = styleEqual(myDisplayData$B, myWorkData$colors)) %>%
          formatCurrency(1:2, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )



          1. Edit -------------------------


          If you prefer using a data.frame:



          library(shiny)
          library(DT)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.frame(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000))

          MyColors <- vector(mode = 'character', length = 0L)

          for (i in seq(nrow(myDisplayData))) {
          A <- myDisplayData$A[i]
          B <- myDisplayData$B[i]
          if (B >= A * 1.03) {
          MyColors[i] <- 'rgb(0,255,255)'
          } else if (B <= A * .7) {
          MyColors[i] <- 'rgb(255, 0, 0)'
          }
          else{
          MyColors[i] <- 'rgb(255, 255, 255)'
          }
          }

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip'
          )
          ) %>% formatStyle('B', target = 'cell', backgroundColor = styleEqual(myDisplayData$B, MyColors)) %>%
          formatCurrency(1:2, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )



          1. Edit -------------------------


          Here is a multi-column approach making the assumption, that all other columns are refering to column "A":



          library(shiny)
          library(DT)
          library(data.table)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.table(replicate(15,sample(round(runif(20,0,300000)), 20, rep=TRUE)))
          names(myDisplayData) <- LETTERS[1:15]
          referenceCol <- "A"
          targetColumns <- names(myDisplayData)[!names(myDisplayData) %in% referenceCol]
          myDisplayData[, index := seq(.N)]

          rowUniqueCols <- paste0("rowUnique", targetColumns)

          for(i in seq(rowUniqueCols)){
          myDisplayData[, (rowUniqueCols[i]) := do.call(paste,c(.SD, sep = "_")), .SDcols=c("index", targetColumns[i])]
          }

          myWorkData <- melt.data.table(myDisplayData, id.vars=c("index", referenceCol), measure.vars = rowUniqueCols)
          myDisplayData[, index := NULL]
          HideCols <- which(names(myDisplayData) %in% rowUniqueCols)
          setnames(myWorkData, "value", "rowUniqueValue")
          myWorkData[, value := as.numeric(sapply(strsplit(rowUniqueValue, "_"), "[[", 2))]
          myWorkData[, variable := NULL]
          myWorkData[, colors := ifelse(value >= .SD*1.3, 'rgb(0,255,255)', 'rgb(255, 255, 255)'), .SDcols=referenceCol]
          myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(value <= .SD*.7, 'rgb(255, 0, 0)', 'rgb(255, 255, 255)'), .SDcols=referenceCol]

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip',
          columnDefs = list(list(visible=FALSE, targets=HideCols))
          )
          ) %>% formatStyle(columns = targetColumns, valueColumns = rowUniqueCols, target = 'cell', backgroundColor = styleEqual(myWorkData$rowUniqueValue, myWorkData$colors)) %>%
          formatCurrency(1:15, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )


          Result:
          Result table






          share|improve this answer














          Here is a soution avoiding the rowCallback:



          library(shiny)
          library(DT)
          library(data.table)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.table(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000))
          myWorkData <- copy(myDisplayData)
          myWorkData[, colors := ifelse(B >= A*1.03, 'rgb(0,255,255)', 'rgb(255, 255, 255)')]
          myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(B <= A*.7, 'rgb(255, 0, 0)', 'rgb(255, 255, 255)')]

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip'
          )
          ) %>% formatStyle('B', target = 'cell', backgroundColor = styleEqual(myDisplayData$B, myWorkData$colors)) %>%
          formatCurrency(1:2, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )



          1. Edit -------------------------


          If you prefer using a data.frame:



          library(shiny)
          library(DT)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.frame(A=c(100000, 200000, 300000), B=c(140000, 80000, 310000))

          MyColors <- vector(mode = 'character', length = 0L)

          for (i in seq(nrow(myDisplayData))) {
          A <- myDisplayData$A[i]
          B <- myDisplayData$B[i]
          if (B >= A * 1.03) {
          MyColors[i] <- 'rgb(0,255,255)'
          } else if (B <= A * .7) {
          MyColors[i] <- 'rgb(255, 0, 0)'
          }
          else{
          MyColors[i] <- 'rgb(255, 255, 255)'
          }
          }

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip'
          )
          ) %>% formatStyle('B', target = 'cell', backgroundColor = styleEqual(myDisplayData$B, MyColors)) %>%
          formatCurrency(1:2, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )



          1. Edit -------------------------


          Here is a multi-column approach making the assumption, that all other columns are refering to column "A":



          library(shiny)
          library(DT)
          library(data.table)

          shinyApp(
          ui = fluidPage(
          DTOutput("dummy_data_table")
          ),

          server = function(input, output) {

          myDisplayData <- data.table(replicate(15,sample(round(runif(20,0,300000)), 20, rep=TRUE)))
          names(myDisplayData) <- LETTERS[1:15]
          referenceCol <- "A"
          targetColumns <- names(myDisplayData)[!names(myDisplayData) %in% referenceCol]
          myDisplayData[, index := seq(.N)]

          rowUniqueCols <- paste0("rowUnique", targetColumns)

          for(i in seq(rowUniqueCols)){
          myDisplayData[, (rowUniqueCols[i]) := do.call(paste,c(.SD, sep = "_")), .SDcols=c("index", targetColumns[i])]
          }

          myWorkData <- melt.data.table(myDisplayData, id.vars=c("index", referenceCol), measure.vars = rowUniqueCols)
          myDisplayData[, index := NULL]
          HideCols <- which(names(myDisplayData) %in% rowUniqueCols)
          setnames(myWorkData, "value", "rowUniqueValue")
          myWorkData[, value := as.numeric(sapply(strsplit(rowUniqueValue, "_"), "[[", 2))]
          myWorkData[, variable := NULL]
          myWorkData[, colors := ifelse(value >= .SD*1.3, 'rgb(0,255,255)', 'rgb(255, 255, 255)'), .SDcols=referenceCol]
          myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(value <= .SD*.7, 'rgb(255, 0, 0)', 'rgb(255, 255, 255)'), .SDcols=referenceCol]

          output$dummy_data_table <- DT::renderDataTable(
          DT::datatable(
          myDisplayData,
          extensions = 'Buttons',
          options = list(
          pageLength = 50,
          scrollX=TRUE,
          dom = 'T<"clear">lBfrtip',
          columnDefs = list(list(visible=FALSE, targets=HideCols))
          )
          ) %>% formatStyle(columns = targetColumns, valueColumns = rowUniqueCols, target = 'cell', backgroundColor = styleEqual(myWorkData$rowUniqueValue, myWorkData$colors)) %>%
          formatCurrency(1:15, currency = "", interval = 3, mark = ",")
          ) # close renderDataTable

          }
          )


          Result:
          Result table







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 6 hours ago

























          answered 2 days ago









          ismirsehregal

          3378




          3378












          • This is great, thank you. One important point - I may have up to 15 columns (I just included 2 in my example for simplicity). So I would need to retain the for loop as in my example. How would that look?
            – matsuo_basho
            2 days ago










          • Are all other columns still refering to the first column regarding the color assignment?
            – ismirsehregal
            2 days ago










          • Please see my second edit.
            – ismirsehregal
            2 days ago










          • Btw: in your question you are mentioning 1.3x but in your JS function it's 1.03. I made it 1.3 in my code now.
            – ismirsehregal
            2 days ago






          • 1




            Just updated my 2. Edit. Now the colors are refering to row-unique helper columns. It's now fully working - please check.
            – ismirsehregal
            6 hours ago


















          • This is great, thank you. One important point - I may have up to 15 columns (I just included 2 in my example for simplicity). So I would need to retain the for loop as in my example. How would that look?
            – matsuo_basho
            2 days ago










          • Are all other columns still refering to the first column regarding the color assignment?
            – ismirsehregal
            2 days ago










          • Please see my second edit.
            – ismirsehregal
            2 days ago










          • Btw: in your question you are mentioning 1.3x but in your JS function it's 1.03. I made it 1.3 in my code now.
            – ismirsehregal
            2 days ago






          • 1




            Just updated my 2. Edit. Now the colors are refering to row-unique helper columns. It's now fully working - please check.
            – ismirsehregal
            6 hours ago
















          This is great, thank you. One important point - I may have up to 15 columns (I just included 2 in my example for simplicity). So I would need to retain the for loop as in my example. How would that look?
          – matsuo_basho
          2 days ago




          This is great, thank you. One important point - I may have up to 15 columns (I just included 2 in my example for simplicity). So I would need to retain the for loop as in my example. How would that look?
          – matsuo_basho
          2 days ago












          Are all other columns still refering to the first column regarding the color assignment?
          – ismirsehregal
          2 days ago




          Are all other columns still refering to the first column regarding the color assignment?
          – ismirsehregal
          2 days ago












          Please see my second edit.
          – ismirsehregal
          2 days ago




          Please see my second edit.
          – ismirsehregal
          2 days ago












          Btw: in your question you are mentioning 1.3x but in your JS function it's 1.03. I made it 1.3 in my code now.
          – ismirsehregal
          2 days ago




          Btw: in your question you are mentioning 1.3x but in your JS function it's 1.03. I made it 1.3 in my code now.
          – ismirsehregal
          2 days ago




          1




          1




          Just updated my 2. Edit. Now the colors are refering to row-unique helper columns. It's now fully working - please check.
          – ismirsehregal
          6 hours ago




          Just updated my 2. Edit. Now the colors are refering to row-unique helper columns. It's now fully working - please check.
          – ismirsehregal
          6 hours ago


















           

          draft saved


          draft discarded



















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53159633%2fdisplaying-commas-and-conditional-highlighting-in-rshiny-not-compatible%23new-answer', 'question_page');
          }
          );

          Post as a guest




















































































          這個網誌中的熱門文章

          Academy of Television Arts & Sciences

          L'Équipe

          1995 France bombings