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
- Add commas to numbers greater than 1000
- 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
This question has an open bounty worth +50
reputation from matsuo_basho ending ending at 2018-11-15 14:43:21Z">in 3 days.
Looking for an answer drawing from credible and/or official sources.
add a comment |
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
- Add commas to numbers greater than 1000
- 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
This question has an open bounty worth +50
reputation from matsuo_basho ending ending at 2018-11-15 14:43:21Z">in 3 days.
Looking for an answer drawing from credible and/or official sources.
add a comment |
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
- Add commas to numbers greater than 1000
- 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
I have a Shiny app rendering a datatable within which I would like to incorporate 2 conditional formatting features
- Add commas to numbers greater than 1000
- 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
javascript r shiny
asked Nov 5 at 17:52
matsuo_basho
504827
504827
This question has an open bounty worth +50
reputation from matsuo_basho ending ending at 2018-11-15 14:43:21Z">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 ending at 2018-11-15 14:43:21Z">in 3 days.
Looking for an answer drawing from credible and/or official sources.
add a comment |
add a comment |
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
)
- 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
)
- 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]
targetColumns <- names(myDisplayData)[!names(myDisplayData) %in% "A"]
myWorkData <- melt.data.table(myDisplayData, id.vars="A", measure.vars=targetColumns)
myWorkData[, variable := NULL]
myWorkData[, colors := ifelse(value >= A*1.3, 'rgb(0,255,255)', 'rgb(255, 255, 255)')]
myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(value <= 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(targetColumns, target = 'cell', backgroundColor = styleEqual(myWorkData$value, myWorkData$colors)) %>%
formatCurrency(seq(ncol(myDisplayData)), currency = "", interval = 3, mark = ",")
) # close renderDataTable
)
Result:
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
yesterday
Please see my second edit.
– ismirsehregal
yesterday
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
yesterday
Just saw there is a problem with the color mapping for the multi-col solution. The displayed values need to be row-unique for this to work otherwise a previously defined color is assigned. Will have another look when back at PC.
– ismirsehregal
yesterday
add a comment |
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
)
- 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
)
- 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]
targetColumns <- names(myDisplayData)[!names(myDisplayData) %in% "A"]
myWorkData <- melt.data.table(myDisplayData, id.vars="A", measure.vars=targetColumns)
myWorkData[, variable := NULL]
myWorkData[, colors := ifelse(value >= A*1.3, 'rgb(0,255,255)', 'rgb(255, 255, 255)')]
myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(value <= 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(targetColumns, target = 'cell', backgroundColor = styleEqual(myWorkData$value, myWorkData$colors)) %>%
formatCurrency(seq(ncol(myDisplayData)), currency = "", interval = 3, mark = ",")
) # close renderDataTable
)
Result:
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
yesterday
Please see my second edit.
– ismirsehregal
yesterday
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
yesterday
Just saw there is a problem with the color mapping for the multi-col solution. The displayed values need to be row-unique for this to work otherwise a previously defined color is assigned. Will have another look when back at PC.
– ismirsehregal
yesterday
add a comment |
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
)
- 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
)
- 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]
targetColumns <- names(myDisplayData)[!names(myDisplayData) %in% "A"]
myWorkData <- melt.data.table(myDisplayData, id.vars="A", measure.vars=targetColumns)
myWorkData[, variable := NULL]
myWorkData[, colors := ifelse(value >= A*1.3, 'rgb(0,255,255)', 'rgb(255, 255, 255)')]
myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(value <= 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(targetColumns, target = 'cell', backgroundColor = styleEqual(myWorkData$value, myWorkData$colors)) %>%
formatCurrency(seq(ncol(myDisplayData)), currency = "", interval = 3, mark = ",")
) # close renderDataTable
)
Result:
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
yesterday
Please see my second edit.
– ismirsehregal
yesterday
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
yesterday
Just saw there is a problem with the color mapping for the multi-col solution. The displayed values need to be row-unique for this to work otherwise a previously defined color is assigned. Will have another look when back at PC.
– ismirsehregal
yesterday
add a comment |
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
)
- 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
)
- 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]
targetColumns <- names(myDisplayData)[!names(myDisplayData) %in% "A"]
myWorkData <- melt.data.table(myDisplayData, id.vars="A", measure.vars=targetColumns)
myWorkData[, variable := NULL]
myWorkData[, colors := ifelse(value >= A*1.3, 'rgb(0,255,255)', 'rgb(255, 255, 255)')]
myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(value <= 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(targetColumns, target = 'cell', backgroundColor = styleEqual(myWorkData$value, myWorkData$colors)) %>%
formatCurrency(seq(ncol(myDisplayData)), currency = "", interval = 3, mark = ",")
) # close renderDataTable
)
Result:
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
)
- 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
)
- 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]
targetColumns <- names(myDisplayData)[!names(myDisplayData) %in% "A"]
myWorkData <- melt.data.table(myDisplayData, id.vars="A", measure.vars=targetColumns)
myWorkData[, variable := NULL]
myWorkData[, colors := ifelse(value >= A*1.3, 'rgb(0,255,255)', 'rgb(255, 255, 255)')]
myWorkData[colors %in% 'rgb(255, 255, 255)', colors := ifelse(value <= 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(targetColumns, target = 'cell', backgroundColor = styleEqual(myWorkData$value, myWorkData$colors)) %>%
formatCurrency(seq(ncol(myDisplayData)), currency = "", interval = 3, mark = ",")
) # close renderDataTable
)
Result:
edited yesterday
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
yesterday
Please see my second edit.
– ismirsehregal
yesterday
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
yesterday
Just saw there is a problem with the color mapping for the multi-col solution. The displayed values need to be row-unique for this to work otherwise a previously defined color is assigned. Will have another look when back at PC.
– ismirsehregal
yesterday
add a comment |
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
yesterday
Please see my second edit.
– ismirsehregal
yesterday
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
yesterday
Just saw there is a problem with the color mapping for the multi-col solution. The displayed values need to be row-unique for this to work otherwise a previously defined color is assigned. Will have another look when back at PC.
– ismirsehregal
yesterday
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
yesterday
Are all other columns still refering to the first column regarding the color assignment?
– ismirsehregal
yesterday
Please see my second edit.
– ismirsehregal
yesterday
Please see my second edit.
– ismirsehregal
yesterday
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
yesterday
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
yesterday
Just saw there is a problem with the color mapping for the multi-col solution. The displayed values need to be row-unique for this to work otherwise a previously defined color is assigned. Will have another look when back at PC.
– ismirsehregal
yesterday
Just saw there is a problem with the color mapping for the multi-col solution. The displayed values need to be row-unique for this to work otherwise a previously defined color is assigned. Will have another look when back at PC.
– ismirsehregal
yesterday
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password