Skip to content

Instantly share code, notes, and snippets.

View matt-dray's full-sized avatar
®️

Matt Dray matt-dray

®️
View GitHub Profile
@matt-dray
matt-dray / external-data-usethis.txt
Last active May 3, 2024 12:33
Steps to create an exported dataset in an R package with {usethis}
1. In your package project, run usethis::use_data_raw("demo-data") to set up a data-raw/ folder with a demo-data.R file inside.
2. Write a script in demo-data.R to produce the data object (e.g. demo_df).
3. Insert and run the line usethis::use_data(demo_df) in demo-data.R, which will save the data object to a data/demo_df.rda file.
4. Run usethis::use_r("demo-data") to create a corresponding R/demo-data.R file where you can document the data.
5. In R/demo-data.R, quote the name of the data object (i.e. "demo_df") and put {roxygen2} code above it (probably at least @title, @description and maybe @format, which might contain a \describe{} block to explain the content of your object, itself containing an \item{} to describe each column if it's a data.frame).
6. Run devtools::document() to generate the man/ pages for the data.
7. Run devtools::load_all() to reload your package and make demo_df available in your session.
8. Once pushed, users can attach the package and access demo_df by name, or access it with pac
/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */
/*! Adapted from https://jeroen.github.io/clippy/bundle.js by Jeroen Ooms */
!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?t
@matt-dray
matt-dray / r-tables.txt
Last active April 16, 2024 17:57
Packages for making tables in R
arsenal::tableby()
DT
flextable
formattable
gt
huxtable
knitr::kable()
kableExtra
mmtable2
modelsummary
@matt-dray
matt-dray / general-cell-nmft.R
Last active April 16, 2024 08:17
Testing 'general' cell number format with {openxlsx2}
x <- palmerpenguins::penguins |>
tidyr::drop_na() |>
dplyr::mutate(
sp = species,
bill = bill_length_mm,
sex = as.character(sex),
.keep = "none"
) |>
head() |>
as.data.frame()
@matt-dray
matt-dray / expand-nested-list.Rmd
Created April 12, 2024 13:27
An experiment to expand a nested list into Rmd sections, including a recursive function to remove blank (`""`) elements
---
title: "Autogenerating Rmd sections from a nested list"
output:
html_document:
code_folding: hide
---
```{r}
remove_blanks_recursively <- function(x) {
@matt-dray
matt-dray / input-checks-rlang-cli.R
Created March 8, 2024 09:47
Example functions to check inputs to a parent function, using {cli} for better messaging and {rlang} for dot collection and to prevent an 'error handling eclipse'
#' Check Class of Argument Inputs
#' @param ... Objects to be checked for class.
#' @param .expected_class Character. The name of the class against which objects
#' @param .call Environment. The environment in which this function is called.
#' will be checked.
#' @noRd
check_class <- function(
...,
.expected_class = c("numeric", "character"),
.call = rlang::caller_env()
@matt-dray
matt-dray / sifter-abstract-assignment.R
Last active March 7, 2024 12:07
Assign abstracts to sifters as equally as possible so that each abstract is reviewed exactly n times
# As above, but checks for exact name and affiliation matches between
# sifters and abstracts.
#
# It's possible certain abstracts might not get assigned, especially given combos
# of sifters writing abstracts, abstracts from sifters' affiliations, assignment
# capping and sifter capping. Should probably report any abstracts that have
# <assignment_cap assignments. As a precaution, have built in a max_iterations arg
# in case of infinite looping, but I don't think that will come into play.
.resample <- function(x, ...) x[sample.int(length(x), ...)] # see ?sample
@matt-dray
matt-dray / badgr-shiny.R
Last active January 8, 2024 13:52
Make a shields.io README badge that links to a Shiny app, using the {badgr} package in R
# Make a README badge for your R Shiny repo
# Matt Dray, March 2021
# {badgr} blog post: https://www.rostrum.blog/2020/05/08/readme-badge/
# Shiny badge blog post: https://www.rostrum.blog/2021/03/23/shiny-badge/
# {badgr} is available from GitHub via {remotes}
install.packages("remotes") # if not already installed
remotes::install_github("matt-dray/badgr") # install {badgr}
@matt-dray
matt-dray / check-vector-pairs-multiples.R
Last active December 18, 2023 21:42
Checking pairs of vector inputs to an R function to see if the longer of each pair is a multiple of the shorter, emit a dynamic warning if so
pair_inputs <- function(...) {
args <- rlang::dots_list(..., .named = TRUE)
args_lengths <- lapply(args, length)
pairs <- combn(args_lengths, 2, simplify = FALSE)
failed <- lapply(pairs, function(x) max(unlist(x)) %% min(unlist(x)) != 0)
if (any(unlist(failed))) {
@matt-dray
matt-dray / check-type.R
Last active December 15, 2023 10:03
A base-R-only function to check argument inputs to another function, using dots to assess several of those inputs at once
test_fn <- function(x = 1L, y = "x", z = 1.1) {
.check_type(x, y, z, type = "numeric")
cat("success")
}
.check_type <- function(..., type = "numeric") {
args <- list(...)
arg_names <- as.character(substitute(...()))
names(args) <- arg_names