Search code examples
rkableextra

How to Insert html in table of KableExtra


Is it possible add div html code in kable code: Reproducible example:

kable(head(iris))

Create a output like that:

` <table>
  <thead>
  <tr>
   <th style="text-align:right;"> Sepal.Length </th>
   <th style="text-align:right;"> Sepal.Width </th>
   <th style="text-align:right;"> Petal.Length </th>
   <th style="text-align:right;"> Petal.Width </th>
   <th style="text-align:left;"> Species </th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td style="text-align:right;"> 5.1 </td>
   <td style="text-align:right;"> 3.5 </td>
   <td style="text-align:right;"> 1.4 </td>
   <td style="text-align:right;"> 0.2 </td>
   <td style="text-align:left;"> setosa </td>
  </tr>
  <tr>
   <td style="text-align:right;"> 4.9 </td>
   <td style="text-align:right;"> 3.0 </td>
   <td style="text-align:right;"> 1.4 </td>
   <td style="text-align:right;"> 0.2 </td>
   <td style="text-align:left;"> setosa </td>
  </tr>
  </tbody>
  </table>`

I want to add <div class = "alter_table"> in the last row for last column

  `<div class = "alter_table"> <td style="text-align:left;"> setosa </td></div>
  <div class = "alter_table"> <td style="text-align:left;"> setosa </td></div>`

I want create automatically using R!


Solution

  • It's always easy to work with HTML tables and you know you can do anything as long as you know how to use xml2. :)

    library(kableExtra)
    library(xml2)
    
    k_xml <- kable(iris[1:2,]) %>%
      kable_as_xml()
    
    k_xml %>%
      xml_child(2) %>%  # Go to <tbody> tag
      xml_child(2) %>%  # 2nd row of <tbody>
      xml_child(5) %>%  # 5th <td>
      xml_set_attr("class", "alter_table") # Add an attribute 
    
    xml_as_kable(k_xml)
    

    See my rstudio::conf workshop slide for details: https://arm.rbind.io/slides/extend.html#1


    Update: If you want 2nd column in , you need some XPATH. Using the example above:

    library(kableExtra)
    library(xml2)
    
    k_xml <- kable(iris[1:2,]) %>%
      kable_as_xml()
    
    k_xml %>%
      xml_child(2) %>%  # Go to <tbody> tag
      xml_find_all("//tr/td[2]") %>%  # Find all 2nd td of tr rows
      xml_set_attr("class", "alter_table") # Add an attribute 
    
    xml_as_kable(k_xml)