{"componentChunkName":"component---src-components-tutorials-js","path":"/tutorials/responsive-tables/","result":{"data":{"markdownRemark":{"html":"<h2>Contents</h2>\n<ol>\n<li><a href=\"#about\">Why would I need this?</a></li>\n<li>\n<p><a href=\"#work\">How does this shiny app work?</a></p>\n<ol>\n<li>\n<p><a href=\"#work-function\">Creating a render datatable function</a></p>\n<ol>\n<li><a href=\"#work-function-headers\">Building the table headers</a></li>\n<li><a href=\"#work-function-body\">Building the table body</a></li>\n<li><a href=\"#work-function-main\">Building the table function</a></li>\n</ol>\n</li>\n<li><a href=\"#work-app\">Preparing the shiny app</a></li>\n<li><a href=\"#work-styles\">Writing the CSS styles</a></li>\n</ol>\n</li>\n<li><a href=\"#further-considerations\">What do I need to know before implementing this into my own application?</a></li>\n<li><a href=\"#run\">How do I run the example application?</a></li>\n</ol>\n<!-- endexcerpt -->\n<span id=\"about\" />\n<h2>Why would I need this?</h2>\n<p>Data tables are a good method for displaying data on the web. However, this can lead to issues of content overflows on mobile devices or if the browser is resized. Using relative units (i.e., %, em, etc.), it's possible to resize the table depending on the window size, but this may result in the text overflowing to neighboring cells or becoming too small to read. This is where building responsive tables can help. Instead of resizing the table, it is better to reorganize the content. For example, it is possible to stack cells as opposed to displaying them in a row. </p>\n<p>Consider the the following figure. In the figure below, the table on the left presents the table in a normal row-by-column layout. The figure on the right shows the same data, but each column is stacked and the first column now acts as a table header.  </p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/bc5000ac3a8cffbca14ca5f44f84d4a9/99072/responsive_tables.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 40.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAw0lEQVQY04WRyRKDIBBE/f+/9OaGWpYrBMiDTqjEHNKHKaGXGcYqhPDI8N6HH8QYqVDOOTQ3qrLW1nXdNA20z4C4rovjeZ6wiKZpQtN1XfwAsgq1MWZZFoKRuoxt247jWNeVim4YhrZtqQgebyQzUiL3fecsJx8yc0lzzCZjHEfuGYpLajIjnefZfgMnClV1xkkW0RpYSGYIRMxfNodNHfRmzCyFHppIockMpyXdllFWLXPf95hJLD1e5r+gv/5W6aH0Jy2U0+ALCsmwAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"responsive data tables\"\n        title=\"responsive data tables\"\n        src=\"/static/bc5000ac3a8cffbca14ca5f44f84d4a9/0a47e/responsive_tables.png\"\n        srcset=\"/static/bc5000ac3a8cffbca14ca5f44f84d4a9/8a4e8/responsive_tables.png 150w,\n/static/bc5000ac3a8cffbca14ca5f44f84d4a9/5a46d/responsive_tables.png 300w,\n/static/bc5000ac3a8cffbca14ca5f44f84d4a9/0a47e/responsive_tables.png 600w,\n/static/bc5000ac3a8cffbca14ca5f44f84d4a9/99072/responsive_tables.png 842w\"\n        sizes=\"(max-width: 600px) 100vw, 600px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>Both tables are use the same data and use html and css to develop. The format changes only when size of the browser is smaller than a predefined breakpoint. In this tutorial and in the example application, we will learn how to create this table for use in a shiny application.</p>\n<p>Originally, this example application was built to solve an issue in another project. However, it was further developed in response to the following R community <a href=\"https://community.rstudio.com/t/create-accessible-html-tables-in-rstudio/46831\">post</a>.</p>\n<span id=\"work\" />\n<h2>How does this shiny app work?</h2>\n<p>It might be possible to use existing packages to create a responsive table, but that might involve overriding css styles or modifying existing render methods which could lead to other issues. Instead, it would be easier to create our own render datatable function to produce a structure that allows us to make a responsive table using CSS.</p>\n<p>In this section, I will walk you through all of the steps required to produce a simple, responsive table. This includes the following.</p>\n<ol>\n<li>Creating a render datatable function</li>\n<li>Preparing the shiny app</li>\n<li>Writing the CSS styles</li>\n</ol>\n<span id=\"work-function\" />\n<h3>Creating a render datatable function</h3>\n<p>Before we write the data table function, it is important to map the flow of data to html output. Here is what we will need to consider when writing the function. </p>\n<ol>\n<li><strong>Determine the HTML elements:</strong> The primary elements of a table are the header (<code>&#x3C;thead></code>), the body (<code>&#x3C;tbody></code>), rows (<code>&#x3C;tr></code>), and cells (either <code>&#x3C;th></code> for headers and <code>&#x3C;td></code> for everything else). In shiny, these elements can be accessed through <code>tags$*</code> (<code>tags$thead</code>, <code>tags$td</code>, etc.). For more information table structures, please see the <a href=\"https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables/Basics\">HTML Table Basics</a> guide and refer to the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table\">table specs</a>.</li>\n<li><strong>Create an outline of the function:</strong> We will need to figure out a way to generate the headers using the column names and render the values in our dataset into HTML cells. In this case, it will likely be easier to write a primary function and two helper functions (one for building the body and one for building the header). The primary function will act as a wrapper around the two helper functions.</li>\n<li><strong>Bind data to html elements for use in CSS:</strong> the way this approach works is by rendering column names in <code>&#x3C;span></code> elements in each cell. This allows us to use css <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries\">media queries</a> to display (or hide) this information when the window is resized.</li>\n<li><strong>Provide a method for configuring rendering of the table:</strong> in some cases, you may not want to have responsive tables. If this is the case, there should be an option to turn off the rendering of the table for responsivity. Other options (html escape, controlling row headers, etc.) should also be added and processed in the handler functions. </li>\n</ol>\n<p>The options that will be used in the function are listed below and are defined in the parent function.</p>\n<ul>\n<li><code>responsive</code>: setting to true will render the required elements for responsive tables</li>\n<li><code>rowHeaders</code>: setting to true will render the first cell of each row as a row header. This is recommended to use if all values in each row are related and have a specific value that describes the row (e.g., study participant data)</li>\n<li><code>asHTML</code>: setting to true allows cell content to render any html in the cell. This may be useful if you want to add line breaks, urls, or other inline elements.</li>\n</ul>\n<p>This will make sense as we start writing the functions and the css. Let's start writing the function.</p>\n<span id=\"work-function-header\" />\n<h4>Building the table header</h4>\n<p>The first helper function will generate the table header element using the column names of the input dataset. The function will also process options from the parent function. </p>\n<p>First, I will start by defining the function. I'll call the function <code>build_header</code> and assign two arguments: <code>data</code> and <code>options</code>. The <code>options</code> argument is a list of options passed through in the parent function.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_header <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Second, pull the names of the columns of the input dataset using the colnames function. </p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_header <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    columns <span class=\"token operator\">&lt;-</span> colnames<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>\n    <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Next, we will create the cells for the table header. Since we want the function to respond the dimensions of the column names, I will used the <code>lapply</code> function to iterate over all columns. This will return a collection of cells (<code>&#x3C;th></code>). </p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_header <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    columns <span class=\"token operator\">&lt;-</span> colnames<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>\n    cells <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>length<span class=\"token punctuation\">(</span>columns<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token ellipsis\">...</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Next, the function will evaluate the options argument in order to render cell content. Specifically, should the cell value be rendered as a string or as an html element? Since the html markup for all column headers is identical (<code>&#x3C;th></code>), the condition will return the cell value with or without escaping html. The option that will be used in the condition <code>asHTML</code>. The options object is a list and the value <code>asHTML</code> can be accessed using <code>options$asHTML</code>. </p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_header <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    columns <span class=\"token operator\">&lt;-</span> colnames<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>\n    cells <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>length<span class=\"token punctuation\">(</span>columns<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>asHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            cell_value <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>HTML<span class=\"token punctuation\">(</span>columns<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            cell_value <span class=\"token operator\">&lt;-</span> columns<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token ellipsis\">...</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Once the cell value (i.e., column name) is rendered, it can now be added to column header element which is <code>&#x3C;th></code> and returned.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_header <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n   columns <span class=\"token operator\">&lt;-</span> colnames<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>\n   cells <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>length<span class=\"token punctuation\">(</span>columns<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n       <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>asHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n           cell_value <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>HTML<span class=\"token punctuation\">(</span>columns<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n       <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n           cell_value <span class=\"token operator\">&lt;-</span> columns<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span>\n       <span class=\"token punctuation\">}</span>\n       cell <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>th<span class=\"token punctuation\">(</span>scope <span class=\"token operator\">=</span> <span class=\"token string\">\"col\"</span><span class=\"token punctuation\">,</span> cell_value<span class=\"token punctuation\">)</span>\n       cell\n   <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n   <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The <code>scope</code> is used for improving the accessibility of tables with ambiguous data. This attribute creates a link between the table cells and the column they are associated with. This allows screen readers to provide more useful information when reading the data aloud. For example, if the user is on line 10 of a dataset, it will the screen reader will say, \"row 10 of n, <em>name of column</em>, <em>value</em>\" (where <em>n</em> is the total number of rows; <em>name of column</em> is the column name of a cell; <em>value</em> is the value of a cell).</p>\n<p>At this point, the object cells is as it sounds, a collection of cells. Before the cells are added to the table, they will need to be wrapped in a row element (<code>tr</code>) and then in the table header element (<code>thead</code>).</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_header <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    columns <span class=\"token operator\">&lt;-</span> colnames<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>\n    cells <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>length<span class=\"token punctuation\">(</span>columns<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>asHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            cell_value <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>HTML<span class=\"token punctuation\">(</span>columns<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            cell_value <span class=\"token operator\">&lt;-</span> columns<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">}</span>\n        cell <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>th<span class=\"token punctuation\">(</span>scope <span class=\"token operator\">=</span> <span class=\"token string\">\"col\"</span><span class=\"token punctuation\">,</span> cell_value<span class=\"token punctuation\">)</span>\n        cell\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>thead<span class=\"token punctuation\">(</span>\n        htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>tr<span class=\"token punctuation\">(</span>role <span class=\"token operator\">=</span> <span class=\"token string\">\"row\"</span><span class=\"token punctuation\">,</span> cells<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The <code>role</code> attribute is added for good accessibility practice. This attribute is important should the css display properties of table elements are changed. This will ensure screen readers still interpret rows correctly.</p>\n<p>Let's test the function using the <code>iris</code> dataset.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_header<span class=\"token punctuation\">(</span>iris<span class=\"token punctuation\">,</span> options <span class=\"token operator\">=</span> list<span class=\"token punctuation\">(</span>responsive <span class=\"token operator\">=</span> <span class=\"token boolean\">TRUE</span><span class=\"token punctuation\">,</span> rowHeaders <span class=\"token operator\">=</span> <span class=\"token boolean\">TRUE</span><span class=\"token punctuation\">,</span> asHTML <span class=\"token operator\">=</span> <span class=\"token boolean\">FALSE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>This function yields the following html markup.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>thead</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>tr</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>row<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">scope</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Sepal.Length<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">scope</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Sepal.Width<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">scope</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Petal.Length<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">scope</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Petal.Width<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">scope</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Species<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>tr</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>thead</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<span id=\"work-function-body\" />\n<h4>Building the table body</h4>\n<p>The function that is used to build the table body is structured a bit different than the header function. To generate the html output, the function will render the table body by rows and columns. This means that we must take the first row in our dataset, build each cell, and add the cells to a row and then repeat this process for row two, row three, and so on. The function will also have conditions for processing the list of options, but this will be added a little later.</p>\n<p>First, define the function. I will call this function <code>build_body</code> and it will have two input arguments <code>data</code> and <code>options</code> (received from the parent function).</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_body <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Second, to get the function to iterate row and column we will use a nested lapply function. The outer lapply function will process all rows and output them to a single object <code>body</code>. The inner lapply function will generate all cells (in a similar manner as the <code>build_header</code> function). To calculate number of iterations to use (i.e., rows and columns), I will use <code>1:NROW(data)</code> and <code>1:NCOL(data)</code>. I have also used the input arguments <code>row</code> and <code>col</code> to make it clear how the values are rendered into html elements.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_body <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    body <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>NROW<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>row<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        cells <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>NCOL<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>col<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            <span class=\"token ellipsis\">...</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token ellipsis\">...</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>To generate the cells, the function will do a couple of things. </p>\n<ol>\n<li>Render the cell content based on the option <code>asHTML</code>.</li>\n<li>Render the html element as based on the option <code>rowHeader</code></li>\n<li>Add cell content to the html element based on the option <code>responsive</code>.</li>\n</ol>\n<p>The rationale for structuring the cells in this way is that when the screen is smaller than a desktop or if the window is resized, then the table is collapsed and the cells are stacked. Another way to look at this is if the transformed from wide to long using either the <code>t()</code> function in base R or the <code>gather()</code> function from dplyr.</p>\n<p>Here is a example of what it happening using some sample data. The sample dataset included in the example app has the 2017 and 2018 reporting rates for Australian birds in the Birds in Backyards survey program. The data is structured in long format where each row is the number of birds reported for a species for a given year. The columns are name, year, and count. Here is the first row in the dataset presented in the normal layout and in the responsive layout.</p>\n<p><strong>Datatable: Normal</strong></p>\n<p>In the normal layout, the table is presented by columns and rows.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">| Common.Name          | Year | Count\n| Australasian Figbird | 2017 | 133</code></pre></div>\n<p><strong>Datatable: Responsive</strong></p>\n<p>In the responsive format, the column names and values are collapsed into a single cell and cells are stacked.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">| Australasian Figbird |\n| year: 2017           |\n| count: 133           |</code></pre></div>\n<p>The first step is to evalue the option <code>asHTML</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_body <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    body <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>NROW<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>row<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        cells <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>NCOL<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>col<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n            <span class=\"token comment\"># asHTML</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>asHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                cell_value <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>HTML<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>row<span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                cell_value <span class=\"token operator\">&lt;-</span> data<span class=\"token punctuation\">[</span>row<span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">]</span>\n            <span class=\"token punctuation\">}</span>\n            <span class=\"token ellipsis\">...</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token ellipsis\">...</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Next, using the option <code>rowHeader</code>, each cell can be built. It is important to note that if you are using this option, the data should be reorganized so that the row headers are first. Otherwise, it would not make a lot sense for individuals using screen readers.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_body <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    body <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>NROW<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>row<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        cells <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>NCOL<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>col<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n            <span class=\"token comment\"># asHTML</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>asHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                cell_value <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>HTML<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>row<span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                cell_value <span class=\"token operator\">&lt;-</span> data<span class=\"token punctuation\">[</span>row<span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">]</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token comment\"># rowHeaders</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>rowHeaders<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> col <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                cell <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>th<span class=\"token punctuation\">(</span>role <span class=\"token operator\">=</span> <span class=\"token string\">\"rowheader\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                cell <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>td<span class=\"token punctuation\">(</span>role <span class=\"token operator\">=</span> <span class=\"token string\">\"cell\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span>\n            <span class=\"token ellipsis\">...</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token ellipsis\">...</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now that the cell markup is define, the function will add content to the cell based on the option <code>responsive</code>. If set to TRUE, this will return the current column name in a span element that is hidden/shown based on screen size. The span element will also have the attribute <code>aria-hidden=\"true\"</code> as the span element is for visual purposes only. Once all conditions are evaluated, the cell is returned.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_body <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    body <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>NROW<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>row<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        cells <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>NCOL<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>col<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n            <span class=\"token comment\"># asHTML</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>asHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                cell_value <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>HTML<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>row<span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                cell_value <span class=\"token operator\">&lt;-</span> data<span class=\"token punctuation\">[</span>row<span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">]</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token comment\"># rowHeaders</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>rowHeaders<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> col <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                cell <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>th<span class=\"token punctuation\">(</span>role <span class=\"token operator\">=</span> <span class=\"token string\">\"rowheader\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                cell <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>td<span class=\"token punctuation\">(</span>role <span class=\"token operator\">=</span> <span class=\"token string\">\"cell\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token comment\"># responsiveness</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>responsive<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                cell<span class=\"token operator\">$</span>children <span class=\"token operator\">&lt;-</span> list<span class=\"token punctuation\">(</span>\n                    htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>span<span class=\"token punctuation\">(</span>\n                        class <span class=\"token operator\">=</span> <span class=\"token string\">\"hidden-colname\"</span><span class=\"token punctuation\">,</span>\n                        `aria<span class=\"token operator\">-</span>hidden` <span class=\"token operator\">=</span> <span class=\"token string\">\"true\"</span><span class=\"token punctuation\">,</span>\n                        colnames<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span>\n                    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    cell_value\n                <span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                cell<span class=\"token operator\">$</span>children <span class=\"token operator\">&lt;-</span> list<span class=\"token punctuation\">(</span>\n                    cell_value\n                <span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token comment\"># return cell</span>\n            cell\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token ellipsis\">...</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>At this point, the object cells is a collection of just that, cells. To add the cells to the table, they need to be returned in the row element <code>tr</code>.</p>\n<p>Lastly, the object <code>body</code> is a collection of rows and the rows need to be added to the body element of the table. This means we will wrap the rows in the element <code>tbody</code> and return the output.</p>\n<p>Here is the final function.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_body <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    body <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>NROW<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>row<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        cells <span class=\"token operator\">&lt;-</span> lapply<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token operator\">:</span>NCOL<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>col<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n            <span class=\"token comment\"># asHTML</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>asHTML<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                cell_value <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>HTML<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>row<span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                cell_value <span class=\"token operator\">&lt;-</span> data<span class=\"token punctuation\">[</span>row<span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">]</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token comment\"># rowHeaders</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>rowHeaders<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> col <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                cell <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>th<span class=\"token punctuation\">(</span>role <span class=\"token operator\">=</span> <span class=\"token string\">\"rowheader\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                cell <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>td<span class=\"token punctuation\">(</span>role <span class=\"token operator\">=</span> <span class=\"token string\">\"cell\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token comment\"># responsiveness</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>isTRUE<span class=\"token punctuation\">(</span>options<span class=\"token operator\">$</span>responsive<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                cell<span class=\"token operator\">$</span>children <span class=\"token operator\">&lt;-</span> list<span class=\"token punctuation\">(</span>\n                    htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>span<span class=\"token punctuation\">(</span>\n                        class <span class=\"token operator\">=</span> <span class=\"token string\">\"hidden-colname\"</span><span class=\"token punctuation\">,</span>\n                        `aria<span class=\"token operator\">-</span>hidden` <span class=\"token operator\">=</span> <span class=\"token string\">\"true\"</span><span class=\"token punctuation\">,</span>\n                        colnames<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span>\n                    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    cell_value\n                <span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n                cell<span class=\"token operator\">$</span>children <span class=\"token operator\">&lt;-</span> list<span class=\"token punctuation\">(</span>\n                    cell_value\n                <span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token comment\"># return cell</span>\n            cell\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token comment\"># return cells in row</span>\n        htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>tr<span class=\"token punctuation\">(</span>role <span class=\"token operator\">=</span> <span class=\"token string\">\"row\"</span><span class=\"token punctuation\">,</span> cells<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># return rows in body</span>\n    htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>tbody<span class=\"token punctuation\">(</span>body<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Let's test the function using the first row of the <code>iris</code> dataset. </p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">build_body<span class=\"token punctuation\">(</span>iris<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> options <span class=\"token operator\">=</span> list<span class=\"token punctuation\">(</span>responsive <span class=\"token operator\">=</span> T<span class=\"token punctuation\">,</span> rowHeaders <span class=\"token operator\">=</span> T<span class=\"token punctuation\">,</span> asHTML <span class=\"token operator\">=</span> F<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>This would return the following html markup.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>tbody</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>tr</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>row<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>rowheader<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>hidden-colname<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-hidden</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Sepal.Length<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n      5.1\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>td</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>cell<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>hidden-colname<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-hidden</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Sepal.Width<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n      3.5\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>td</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>td</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>cell<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>hidden-colname<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-hidden</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Petal.Length<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n      1.4\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>td</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>td</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>cell<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>hidden-colname<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-hidden</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Petal.Width<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n      0.2\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>td</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>td</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>cell<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>hidden-colname<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-hidden</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Species<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n      1\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>td</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>tr</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>tbody</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<span id=\"work-function-main\" />\n<h4>Building the table function</h4>\n<p>Now that the two helper functions are written, they can be used to create the main function. This function will generate the table body and header, as well as a caption (or title for the table) all using the list of options. For simplicity, I have named this function <code>datatable</code> and have defined the following input arguments. </p>\n<ul>\n<li><strong>data</strong>: the object containing the data that you want to be rendered as an html table.</li>\n<li><strong>id</strong>: a unique ID to be applied to the table element. This is optional, but recommended if you are rendering more than one table on the same page using this function.</li>\n<li><strong>caption</strong>: an title to render with the table (optional).</li>\n<li>\n<p><strong>options</strong>: a list of options, <code>options = list(...)</code></p>\n<ul>\n<li><code>responsive</code>: a logical arg for turning on/off the rendering of additional elements for responsive tables (i.e., span; default = FALSE)</li>\n<li><code>rowHeaders</code>: a logical arg that renders the first cell of every row as a row header. This is useful for datasets where all data in a row is related, e.g., patient data. If set to TRUE, the data must be organized so that the row header is the first column.</li>\n<li><code>asHTML</code>: a logical argument used to render cell text as html elements (default = FALSE)</li>\n</ul>\n</li>\n</ul>\n<p>First, I have defined the function and the input arguments, as well as built the table header and table body using the input data.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">datatable <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> id <span class=\"token operator\">=</span> <span class=\"token keyword\">NULL</span><span class=\"token punctuation\">,</span> caption <span class=\"token operator\">=</span> <span class=\"token keyword\">NULL</span><span class=\"token punctuation\">,</span> options <span class=\"token operator\">=</span> list<span class=\"token punctuation\">(</span>responsive <span class=\"token operator\">=</span> <span class=\"token boolean\">TRUE</span><span class=\"token punctuation\">,</span> rowHeaders <span class=\"token operator\">=</span> <span class=\"token boolean\">TRUE</span><span class=\"token punctuation\">,</span> asHTML <span class=\"token operator\">=</span> <span class=\"token boolean\">FALSE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\"># render table and table elements</span>\n    tbl <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>table<span class=\"token punctuation\">(</span>class <span class=\"token operator\">=</span> <span class=\"token string\">\"datatable\"</span><span class=\"token punctuation\">,</span>\n        datatable_helpers<span class=\"token operator\">$</span>build_header<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        datatable_helpers<span class=\"token operator\">$</span>build_body<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n\n    <span class=\"token ellipsis\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Next, if an id is supplied, the table attributes will need to be updated.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">datatable <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> id <span class=\"token operator\">=</span> <span class=\"token keyword\">NULL</span><span class=\"token punctuation\">,</span> caption <span class=\"token operator\">=</span> <span class=\"token keyword\">NULL</span><span class=\"token punctuation\">,</span> options <span class=\"token operator\">=</span> list<span class=\"token punctuation\">(</span>responsive <span class=\"token operator\">=</span> <span class=\"token boolean\">TRUE</span><span class=\"token punctuation\">,</span> rowHeaders <span class=\"token operator\">=</span> <span class=\"token boolean\">TRUE</span><span class=\"token punctuation\">,</span> asHTML <span class=\"token operator\">=</span> <span class=\"token boolean\">FALSE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\"># render table and table elements</span>\n    tbl <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>table<span class=\"token punctuation\">(</span>class <span class=\"token operator\">=</span> <span class=\"token string\">\"datatable\"</span><span class=\"token punctuation\">,</span>\n        datatable_helpers<span class=\"token operator\">$</span>build_header<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        datatable_helpers<span class=\"token operator\">$</span>build_body<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># add id</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>is.null<span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        tbl<span class=\"token operator\">$</span>attribs<span class=\"token operator\">$</span>id <span class=\"token operator\">&lt;-</span> id\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The last step in the function evaluates if a caption should be added to the table. Captions are typically placed after the opening table tag so this would would effect how sub-elements, or children, are added to the parent element (table); an if statement can handle this. Child elements can be added to an html element using <code>tbl$children</code>. Since these are html outputs, all child elements are added as a list. </p>\n<p>Here is the final function.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">datatable <span class=\"token operator\">&lt;-</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> id <span class=\"token operator\">=</span> <span class=\"token keyword\">NULL</span><span class=\"token punctuation\">,</span> caption <span class=\"token operator\">=</span> <span class=\"token keyword\">NULL</span><span class=\"token punctuation\">,</span> options <span class=\"token operator\">=</span> list<span class=\"token punctuation\">(</span>responsive <span class=\"token operator\">=</span> <span class=\"token boolean\">TRUE</span><span class=\"token punctuation\">,</span> rowHeaders <span class=\"token operator\">=</span> <span class=\"token boolean\">TRUE</span><span class=\"token punctuation\">,</span> asHTML <span class=\"token operator\">=</span> <span class=\"token boolean\">FALSE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\"># render table and table elements</span>\n    tbl <span class=\"token operator\">&lt;-</span> htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>table<span class=\"token punctuation\">(</span>class <span class=\"token operator\">=</span> <span class=\"token string\">\"datatable\"</span><span class=\"token punctuation\">,</span>\n        datatable_helpers<span class=\"token operator\">$</span>build_header<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        datatable_helpers<span class=\"token operator\">$</span>build_body<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span>\n\n    <span class=\"token comment\"># add id</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>is.null<span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        tbl<span class=\"token operator\">$</span>attribs<span class=\"token operator\">$</span>id <span class=\"token operator\">&lt;-</span> id\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\"># should a caption be rendered?</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>is.null<span class=\"token punctuation\">(</span>caption<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        tbl<span class=\"token operator\">$</span>children <span class=\"token operator\">&lt;-</span> list<span class=\"token punctuation\">(</span>\n            htmltools<span class=\"token operator\">::</span>tags<span class=\"token operator\">$</span>caption<span class=\"token punctuation\">(</span>caption<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            tbl<span class=\"token operator\">$</span>children\n        <span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\"># return</span>\n    tbl\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Let's test the function using the first row of the iris dataset.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">datatable<span class=\"token punctuation\">(</span>data <span class=\"token operator\">=</span> iris<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> id<span class=\"token operator\">=</span><span class=\"token string\">\"iris\"</span><span class=\"token punctuation\">,</span> caption <span class=\"token operator\">=</span> <span class=\"token string\">\"Iris Dataset\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>This would yield the following markup.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>table</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>datatable<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>datatable-iris<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>caption</span><span class=\"token punctuation\">></span></span>Iris Dataset<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>caption</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>thead</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>tr</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>row<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">scope</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Sepal.Length<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">scope</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Sepal.Width<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">scope</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Petal.Length<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">scope</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Petal.Width<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">scope</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Species<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>tr</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>thead</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>tbody</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>tr</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>row<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>th</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>rowheader<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>hidden-colname<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-hidden</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Sepal.Length<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n        5.1\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>th</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>td</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>cell<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>hidden-colname<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-hidden</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Sepal.Width<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n        3.5\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>td</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>td</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>cell<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>hidden-colname<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-hidden</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Petal.Length<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n        1.4\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>td</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>td</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>cell<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>hidden-colname<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-hidden</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Petal.Width<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n        0.2\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>td</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>td</span> <span class=\"token attr-name\">role</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>cell<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>hidden-colname<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">aria-hidden</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>true<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Species<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n        setosa\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>td</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>tr</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>tbody</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>table</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<span id=\"work-app\" />\n<h3>Preparing the shiny app</h3>\n<p>In a shiny applicaiton, the function can be used as any other server output. Since the output of the function is a shiny tags list, it should be rendered used <code>renderUI</code> and added to the server output.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\"><span class=\"token comment\"># server.R</span>\noutput<span class=\"token operator\">$</span>tbl <span class=\"token operator\">&lt;-</span> renderUI<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    datatable<span class=\"token punctuation\">(</span>data <span class=\"token operator\">=</span> iris<span class=\"token punctuation\">,</span> id <span class=\"token operator\">=</span> <span class=\"token string\">\"iris\"</span><span class=\"token punctuation\">,</span> caption <span class=\"token operator\">=</span> <span class=\"token string\">\"Iris Dataset\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Then, on the client side, create the corresponding <code>uiOutput</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\"><span class=\"token comment\"># ui.R</span>\nuiOutput<span class=\"token punctuation\">(</span><span class=\"token string\">\"tbl\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<span id=\"work-styles\" />\n<h3>Writing the CSS styles</h3>\n<p> Using <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries\">media queries</a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements\">pseudo-elements</a>, the column name is displayed before the value of a cell only when the screen width is less than a maximum value. In this example, I'm using <code>892px</code> as a break point. This breakpoint is completely arbitrary. I typically choose breakpoints around <code>900px</code>, but the final point depends on the table structure and the cell content. Choose a number and see how the table looks when the screen is resized and adjust as necessary. </p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@media</span> <span class=\"token punctuation\">(</span><span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 892px<span class=\"token punctuation\">)</span></span><span class=\"token punctuation\">{</span>\n    ...\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In the datatable function, each cell (<code>td</code>) was given a span element that has the class <code>hidden-colname</code>. In a css file, the properties associated with this class will be modified to visually hide or display elements. </p>\n<p>Using the breakpoint <code>892px</code>, the following properties are used to visually display the column names and visually hide the table header when screen size is less than the <code>892px</code>. All cells and row headers (if present) are displayed as blocks.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token comment\">/* screens less than 892px */</span>\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> <span class=\"token punctuation\">(</span><span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 892px<span class=\"token punctuation\">)</span></span><span class=\"token punctuation\">{</span>\n    <span class=\"token selector\">.datatable thead</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> absolute<span class=\"token punctuation\">;</span>\n        <span class=\"token property\">clip</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rect</span><span class=\"token punctuation\">(</span>1px 1px 1px 1px<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token property\">clip</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rect</span><span class=\"token punctuation\">(</span>1px<span class=\"token punctuation\">,</span> 1px<span class=\"token punctuation\">,</span> 1px<span class=\"token punctuation\">,</span> 1px<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 1px<span class=\"token punctuation\">;</span>\n        <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 1px<span class=\"token punctuation\">;</span>\n        <span class=\"token property\">overflow</span><span class=\"token punctuation\">:</span> hidden<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token selector\">.datatable tbody tr th,\n    .datatable tbody tr td</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> block<span class=\"token punctuation\">;</span>\n        <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 5px 0 5px 12px<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token selector\">.datatable .hidden-colname</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> inline-block<span class=\"token punctuation\">;</span>\n        <span class=\"token property\">clip</span><span class=\"token punctuation\">:</span> auto<span class=\"token punctuation\">;</span>\n        <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 150px<span class=\"token punctuation\">;</span>\n        <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> auto<span class=\"token punctuation\">;</span>\n        <span class=\"token property\">line-height</span><span class=\"token punctuation\">:</span> 1<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Outside of the media query, the properties for <code>hidden-colname</code> are different as we want the column names to be visually hidden when the screen is larger than <code>892px</code>. </p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.datatable .hidden-colname</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> inline-block<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">clip</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rect</span><span class=\"token punctuation\">(</span>1px 1px 1px 1px<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token property\">clip</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rect</span><span class=\"token punctuation\">(</span>1px<span class=\"token punctuation\">,</span> 1px<span class=\"token punctuation\">,</span> 1px<span class=\"token punctuation\">,</span> 1px<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 1px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 1px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">overflow</span><span class=\"token punctuation\">:</span> hidden<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>There are additional stylings in the css file. I will not discuss them here as they mainly set the style of other table elements. The block above is the most important block stylings for displaying the column names.</p>\n<span id=\"further-considerations\" />\n<h2>What do I need to know before implementing this into my own application?</h2>\n<p><del>There are accessibility concerns when the table is transformed. For inviduals who use screen readers or other web assistive technologies, does the layout make sense and can the information be understood? Since the display properties of table elements are adjusted, it is likely that the screen readers will not treat the cells as standard table elements. It is likely that the cells will be interpreted as regular text elements. Adding additional attributes might help address this, but more research is required. Please keep this in mind when implementing this approach into your application. I will address this in the near future.</del></p>\n<p>As of January 14th, the above concern has been largely addressed. Although, I'm still testing and making adjustments. I'm not quite ready to remove this item yet as it may be useful for future readers.</p>\n<p>This approach provides a simple method for converting data to HTML tables. However, it is fairly basic in features. There is no support for more advanced layouts (i.e., nested tables, grouped columns or rows) as complex layouts are a difficult to make accessible. As this function was originally intended to address an issue for a work project, I did not have a need for complex layouts and other rendering options. Although, it is likely that I will need this in the near future. Stay tuned for future updates! </p>\n<blockquote>\n<p>This example has led to the begining of an accessible components library for shinyapps. There have been a number of updates to the function (performance and features) that may be useful for developing and customizing tables in shiny apps. Check it out the <a href=\"https://github.com/davidruvolo51/accessibleshiny\">accessibleshiny</a> package. </p>\n</blockquote>\n<h2>How do I run the example application?</h2>\n<p>The demo can be run by cloning the <a href=\"https://github.com/davidruvolo51/shinyAppTutorials\">shinyAppTutorials</a> respository and opening the responsive data tables R project file or you can run the following code from within R studio.</p>\n<div class=\"gatsby-highlight\" data-language=\"r\"><pre class=\"language-r\"><code class=\"language-r\">install.packages<span class=\"token punctuation\">(</span>shiny<span class=\"token punctuation\">)</span>\nshiny<span class=\"token operator\">::</span>runGitHub<span class=\"token punctuation\">(</span>repo <span class=\"token operator\">=</span> <span class=\"token string\">\"shinyAppTutorials\"</span><span class=\"token punctuation\">,</span> username <span class=\"token operator\">=</span> <span class=\"token string\">\"davidruvolo51\"</span><span class=\"token punctuation\">,</span> subdir<span class=\"token operator\">=</span><span class=\"token string\">\"responsive-datatables\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>I would also checkout the tutorial <a href=\"../sass-in-shiny/\">Using SASS in Shiny</a> where I recreate this application using sass.</p>","frontmatter":{"title":"Responsive Datatables","subtitle":"Creating a custom datatable function to reorgranize content for mobile devices","abstract":"Data tables are a good method for displaying data on the web. However, this can lead to issues of content overflows on mobile devices or if the browser is resized. In this tutorial, we will learn how to create a responsive table for use in shiny.","date":"2019-12-12","updated":"2020-01-29","keywords":["html","css"]},"fields":{"readingTime":{"minutes":18.955}}}},"pageContext":{"slug":"/tutorials/responsive-tables/"}},"staticQueryHashes":["63159454"]}