Highlight cells in markdown tables

R-bloggers 2013-04-10

(This article was first published on rapporter, and kindly contributed to R-bloggers)
Although I have always wanted to add such feature to pander, a recent question on SO urged me to create some helper functions so that users could easily highlight some rows, columns or even just a few cells in a table and export the result to markdown, docx, pdf or any other fancy formats - right from R. The new helper functions can be found in the most recent version of pander on GitHub and will soon get to CRAN too. Until then, please update pander to 0.3.5 with devtools:
library(devtools) install_github('pander', 'Rapporter') 
But back to the topic, pandoc.table gained a few new arguments to highlight cells in a table. These are:
  • emphasize.rows
  • emphasize.cols
  • emphasize.cells
  • emphasize.strong.rows
  • emphasize.strong.cols
  • emphasize.strong.cells
emphasize would turn the affected cells to italic, while emphasize.strong would apply a bold style in the cell. Of course a cell can be italic and strong at the same time if both type of arguments would affect that. Arguments ending in rows or cols take a vector (e.g. which columns or rows to emphasize in a table), while the cells argument take either a vector (for one dimensional "tables") or an array-like data structure with two columns holding row and column indexes of cells to be emphasized -- just like what which(..., arr.ind = TRUE) returns. It might be easier to present this feature with a few examples:
> pandoc.table(iris[1:3, ], emphasize.rows = 1, emphasize.cols = 2)  -------------------------------------------------------------------  Sepal.Length   Sepal.Width   Petal.Length   Petal.Width   Species  -------------- ------------- -------------- ------------- ---------     *5.1*          *3.5*         *1.4*          *0.2*     *setosa*        4.9           *3.0*          1.4            0.2       setosa         4.7           *3.2*          1.3            0.2       setosa   -------------------------------------------------------------------  > pandoc.table(iris[1:3, ], emphasize.strong.cells = which(iris[1:3, ] > 3, arr.ind = TRUE))  -------------------------------------------------------------------  Sepal.Length   Sepal.Width   Petal.Length   Petal.Width   Species  -------------- ------------- -------------- ------------- ---------    **5.1**        **3.5**         1.4            0.2       setosa       **4.9**          3.0           1.4            0.2       setosa       **4.7**        **3.2**         1.3            0.2       setosa   ------------------------------------------------------------------- 
Or with some helper functions not touching the pandoc.table call:
> t <- mtcars[1:3, 1:5] > emphasize.cols(1) > emphasize.rows(1) > pandoc.table(t)  ----------------------------------------------------                      mpg    cyl   disp   hp    drat  ------------------- ------ ----- ------ ----- ------    **Mazda RX4**     *21*   *6*  *160*  *110* *3.9*    **Mazda RX4 Wag**   *21*    6    160    110   3.9      **Datsun 710**    *22.8*   4    108    93    3.85  ----------------------------------------------------  > emphasize.strong.cells(which(t > 20, arr.ind = TRUE)) > pander(t)  ---------------------------------------------------------                       mpg     cyl   disp     hp     drat  ------------------- -------- ----- ------- ------- ------    **Mazda RX4**     **21**    6   **160** **110**  3.9     **Mazda RX4 Wag**   **21**    6   **160** **110**  3.9      **Datsun 710**    **22.8**   4   **108** **93**   3.85  --------------------------------------------------------- 
As you can see above, there is no need to directly call pandoc.table in most of the cases as pander being a generic S3 method would already know if pandoc.table is to be called from the list of Pandoc-related functions. So the functions can be also used without calling pandoc.table with the above described parameters, just like some other helpers that can be useful while creating a report - with knitr or any other backend. For example running Pandoc.brew on the following chunk:
<%= set.seed(7) m <- mtcars[sample(1:32, 5), 1:5] set.caption("Fast cars") set.alignment('center') emphasize.strong.rows(which(m$hp > 100)) m %> 
Would result in a markdown dokument:
------------------------------------------------------------------                        mpg       cyl      disp      hp      drat   -------------------- -------- --------- -------- -------- --------    **Volvo 142E**    **21.4** **4.11**  **180**  **258**   **8**       **Merc 450SL**     **4**   **17.3**  **3.07** **110**  **360**    **Hornet 4 Drive**  **121**    **8**   **21.4** **3.08** **245**      **Datsun 710**      22.8       4       108       93      3.85       **Duster 360**    **109**  **275.8**  **6**   **14.3** **3.21** ------------------------------------------------------------------  Table: Fast cars 
Or directly in a docx, odt or pdf file if calling Pandoc.brew with the convert argument. See the relevant docs for more details.

To leave a comment for the author, please follow the link and comment on his blog: rapporter.

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series,ecdf, trading) and more...