Dynamic percentage bars per row with formattable

456 Views Asked by At

I have a data.frame with 13 rows and 18 columns. The objective is to create a percentage bar row-wise.

From the documentation of formattable, a percentage bar may not be supported straight out of the box.

MRE:

The dummy data.frame as follows:

frame <- data.frame(replicate(18,sample(0:1,13,rep=TRUE)))

#load library
library(formattable)

The next line creates the percentage bars for the first row:

formattable(
            frame, list(area(1, 1:18) ~ color_bar("lightgray", function(col) col/sum(col))))

The following creates percentage bars for all of the rows, but it's hard coded:

formattable(
  frame, list(area(1, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(2, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(3, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(4, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(5, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(6, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(7, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(8, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(9, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(10, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(11, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(12, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)),
                       area(13, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col)))
) #works per row, not scalable

The idea is to create the chart above, dynamically (for n variable of rows)

Things that I have tried and not work include:

formattable(
  frame, list(area(1:13, 1:ncol(frame)) ~ color_bar("lightgray", function(col) col/sum(col))))

This one does not work because it creates a full area, so the percentages are based on the complete frame.

1

There are 1 best solutions below

0
On BEST ANSWER

This did it:

formattable(frame,
            lapply(as.list(1:nrow(frame)), function(row) {
              area(row, 1:ncol(frame)) ~ color_bar('lightgray', function(row) row/sum(row))
            }))