Understanding R Markdown and LaTeX Output
===============
As a technical blogger, I’ve encountered various issues with R Markdown and LaTeX output. In this article, we’ll explore one such issue involving sapply
and its impact on LaTeX output.
Introduction to R Markdown and LaTeX
R Markdown is a format for authoring documents that combines the power of Markdown formatting with the functionality of R programming language. It allows users to create reports, articles, and other types of documents using R code.
Latex is a typesetting system used for producing high-quality printed and digital documents. In R Markdown, we can use LaTeX to generate tables, figures, and other graphical elements.
The Problem: sapply
and LaTeX Output
The problem arises when we try to use sapply
with LaTeX output in R Markdown. As shown in the example code below, lapply
runs without any issues, but sapply
introduces an unwanted character at the beginning of line 87 in the LaTeX file.
---
title: "reprex"
output:
pdf_document:
latex_engine: xelatex
editor_options:
chunk_output_type: console
---
library(tidyverse)
library(kableExtra)
species = c("Human", "Droid")
lapply(species, function(x){
starwars %>%
select(name, birth_year) %>%
kable() %>%
kable_styling(fixed_thead = TRUE, latex_options = c("striped", "scale_down"))%>%
row_spec(0, bold = TRUE)
})
library(tidyverse)
library(kableExtra)
species = c("Human", "Droid")
sapply(species, function(x){
starwars %>%
select(name, birth_year) %>%
kable() %>%
kable_styling(fixed_thead = TRUE, latex_options = c("striped", "scale_down"))%>%
row_spec(0, bold = TRUE)
})
Understanding the Issue
The issue arises because sapply
returns a vector of characters instead of a list like lapply
. This is due to the fact that sapply
uses rbind()
internally, which creates a vector of characters.
str(sapply(species, function(x){
starwars %>%
dplyr::filter(species == x) %>%
select(name, birth_year) %>%
kable() %>%
kable_styling(fixed_thead = TRUE, latex_options = c("striped", "scale_down")) %>%
row_spec(0, bold = TRUE)
}, simplify = FALSE)[[1]])
#> 'kableExtra' chr "<table class=\"table\" style=\"margin-left: auto; margin-right: auto;\">\n <thead>\n <tr>\n <th style=\"text"| __truncated__
A Possible Solution
One possible solution to this issue is to add a line in the function that actually does something with the variable x
. For example, we could filter the data using dplyr
.
library(tidyverse)
library(kableExtra)
species = c("Human", "Droid")
str(sapply(species, function(x){
starwars %>%
dplyr::filter(species == x) %>%
select(name, birth_year) %>%
kable() %>%
kable_styling(fixed_thead = TRUE, latex_options = c("striped", "scale_down")) %>%
row_spec(0, bold = TRUE)
}, simplify = FALSE)[[1]])
#> 'kableExtra' chr "<table class=\"table\" style=\"margin-left: auto; margin-right: auto;\">\n <thead>\n <tr>\n <th style=\"text"| __truncated__
By doing so, we can compare the output of sapply
with and without filtering.
library(tidyverse)
library(kableExtra)
species = c("Human", "Droid")
str(sapply(species, function(x){
starwars %>%
dplyr::filter(species == x) %>%
select(name, birth_year) %>%
kable() %>%
kable_styling(fixed_thead = TRUE, latex_options = c("striped", "scale_down")) %>%
row_spec(0, bold = TRUE)
}, simplify = FALSE)[[1]])
#> 'kableExtra' chr "<table class=\"table\" style=\"margin-left: auto; margin-right: auto;\">\n <thead>\n <tr>\n <th style=\"text"| __truncated__
str(sapply(species, function(x){
starwars %>%
dplyr::filter(species == x) %>%
select(name, birth_year) %>%
kable() %>%
kable_styling(fixed_thead = TRUE, latex_options = c("striped", "scale_down")) %>%
row_spec(0, bold = TRUE)
}, simplify = TRUE)[[1]])
#> chr "<table class=\"table\" style=\"margin-left: auto; margin-right: auto;\">\n <thead>\n <tr>\n <th style=\"text"| __truncated__
Conclusion
In conclusion, the issue with sapply
and LaTeX output in R Markdown arises because sapply
returns a vector of characters instead of a list like lapply
. To fix this issue, we can add a line in the function that actually does something with the variable x
, such as filtering the data.
By doing so, we can compare the output of sapply
with and without filtering. This will help us understand why sapply
is returning a vector of characters instead of a list like lapply
.
References
reprex
: A package for creating reproducible examples in R.kableExtra
: An extension to thekable()
function in R, providing more formatting options.
Additional Resources
R Markdown Documentation
: The official documentation for R Markdown.Knitr Documentation
: The official documentation for Knitr.
Last modified on 2023-06-11