-- Leo's gemini proxy

-- Connecting to republic.circumlunar.space:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

R functions for creating LaTeX variables


DATE: 2020-01-07

AUTHOR: John L. Godlee



After writing some more for a manuscript I decided to formalise my workflow where I output numerical variables from R for use in LaTeX, so if the values change they update automatically in the manuscript. Below is a collection of functions which make the process easier:


Formatting a number with the correct number of decimal points or significant figures:


num_format <- function(x, digits = 2, method = "round"){
  sprintf(paste0("%.",digits,"f"),
    if(method == "round"){
      round(x, digits = digits)
    }else if(method == "signif"){
      signif(x, digits = digits)
    })
}

Formatting a p-value:


p_format <- function(p, digits = 2){
  dplyr::case_when(p < 0.01 ~ "p<0.01",
    p < 0.05 ~ "p<0.05",
    TRUE ~ paste0("p = ", as.character(num_format(p, digits = digits)))
  )
}

p_format(1.1) = "p = 1.10"

p_format(0.025) = "p&lt;0.05"

p_format(0.494, digits = 1) = "p = 0.5"


Extracting the slope and standard error from a linear regression:


lm_format <- function(x, digits = 2){
  paste0("F(",
    summary(x)$fstatistic[2],
    ",",
    summary(x)$fstatistic[3],
    ") = ",
    num_format(summary(x)$fstatistic[1], digits = digits),
    ", ",
    p_format(anova(x)$`Pr(>F)`[1])
  )
}

mod1 <- lm(mtcars$mpg ~ mtcars$hp


lm_format(mod1) = "F(1,30) = 45.46, p&lt;0.01"


Formatting two arbitrary numbers as x plus/minus y:


pm_format <- function(x, y, dx = 2, dy = dx + 1, pm = "$\\pm$"){
  paste0(num_format(x, digits = dx),
    pm,
    num_format(y, digits = dy)
  )
}

pm_format(0.3332, 0.4673) = "0.33$\pm$0.467"

pm_format(0.3332, 0.4673, dx = 1, dy = 3) = "0.3$\pm$0.467"


Output the value of a variable as a LaTeX variable:


command_output <- function(x, name){
  paste0("\\newcommand{\\",
    ifelse(missing(name), deparse(substitute(x)), name),
    "}{",
    x,
    "}"
  )
}

x <- 0.4367


command_output(x) = "\newcommand{\x}{0.4367}"

command_output(x, "test") = "\newcommand{\test}{0.4367}"


Notice that all the backslashes have to be duplicated to escape them when they are written to a file.


Write a list of commands to a .tex file:


latex_write <- function(list, path){
  fileConn <- file(path)
  writeLines(
    unlist(list, use.names = FALSE), fileConn)
  close(fileConn)
}

Full example:


val1 <- 0.55
val2 <- 0.2477
val3 <- 0.044

values_list <- list(val1 = val1, val2 = val2, val3 = val3)

command_list <- list()
for(i in 1:length(values_list)){
    command_list[[i]] <- command_output(
      num_format(
        values_list[[i]]
        ),
      names(values_list[i])
    )
}

latex_write(command_list, "test.tex")

-- Response ended

-- Page fetched on Sat May 18 17:12:29 2024