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 / app.R
Last active August 8, 2024 08:49
Quick demo Shiny app with {bslib} navbar with tabs and panels, and a sidebar with (conditional) dropdown selectors and checkboxes
set.seed(123)
n <- 5
scheme <- paste("Scheme", 1:n)
mitigator <- paste("Mitigator", LETTERS[1:n])
combos <- tidyr::crossing(scheme, mitigator)
nrows <- nrow(combos)
dat <- combos |>
dplyr::mutate(
mitigator_group = dplyr::if_else(
stringr::str_detect(mitigator, " [ABC]$"),
@matt-dray
matt-dray / responsive-facet-height.R
Created June 28, 2024 14:07
{ggplot2} plot-height determined by facet row count: halve the height of the output if the second facet row is missing
# Calculate how many plots will be produced
count_plots <- function(df, var) {
length(unique(df[[var]]))
}
# Plot faceted chart, save with height dependent on plot count
write_responsive_facets <- function(
df,
var = "species",
plot_count = count_plots(df, var),
@matt-dray
matt-dray / nara-grid.R
Last active June 25, 2024 08:04
Messing about with kenney.nl sprites on a grid with {nara}
# {nara} by Mike Cheng: https://coolbutuseless.github.io/package/nara/index.html
# Kenney by Kenney: https://www.kenney.nl
# Read png tiles
tile_paths <- list.files(
"~/Desktop/kenney/kenney_tiny-dungeon/Tiles",
pattern = ".png$",
full.names = TRUE,
recursive = TRUE
@matt-dray
matt-dray / compare-sheet-names.R
Last active June 21, 2024 15:43
Extract spreadsheet sheet-names from multiple workbooks into a list of vectors and compare between all pairs
# 1. Generate temporary Excel files ----
# Make a temporary spreadsheet with named sheets
make_temp_xlsx <- function(sheet_names) {
wb <- openxlsx2::wb_workbook()
for (sheet in sheet_names) wb <- wb |> openxlsx2::wb_add_worksheet(sheet)
temp <- openxlsx::temp_xlsx()
openxlsx2::wb_save(wb, temp)
}
@matt-dray
matt-dray / storage_read_json.R
Created June 20, 2024 13:16
Sketch for function in the style of `AzureStor::storage_read_*()` but for json/json.gz
#' Convenience Function: Read a (Zipped) JSON File from an Azure Container
#'
#' @param container A blob_container/storage_container object. Probably
#' generated by [connect_to_container].
#' @param file Character. Path to file within the container named by
#' `container`.
#'
#' @return A list.
#' @export
#'
@matt-dray
matt-dray / generate_num_format.R
Created May 28, 2024 19:54
Quick function to split a number and convert it to an Excel-style numFmt
generate_num_format <- function(number = 8634567.890) {
num_val <- number %/% 1
num_dp <- number %% 1
num_split <- strsplit(as.character(number), "\\.")[[1]]
n_dp <- nchar(num_split[2])
num_commas <- scales::number(as.numeric(num_val), big.mark = ",")
fmt_out <- gsub("[[:digit:]]", "#", num_commas)
@matt-dray
matt-dray / github-tag-and-release.md
Created May 24, 2024 14:21
Quick step-by-step to tag and release via GitHub
  1. On the repo homepage, click the text 'Releases' in the right-hand section.
  2. Click the 'Draft a new release' button (upper-right).
  3. Click the 'Choose a tag' button (upper-left). This is going to 'tag' this point in the Git history with the version number.
  4. Type in the box the version you're releasing, e.g. 'v0.1.1'.
  5. Click '➕ Create new tag: v0.1.1 on publish' that appears under the box.
  6. Click 'Generate release notes', which will autoname the release with the tag autofill the notes with a bullet per PR since the last release
  7. Click 'Publish release' button (lower-right) to publish the release and add the tag to the version history.
  8. Return to the repo's homepage, where you'll see that the version number has incremented under the 'Releases' section.
@matt-dray
matt-dray / github-etiquette.md
Last active May 17, 2024 12:02
Notes for a 'GitHub Etiquette' talk

Title

  • GitHub etiquette
  • GitHub in a small team
  • GitHub: what works for us
  • A loose GitHub playbook
  • GitHub is a team sport

Angle

@matt-dray
matt-dray / external-data-usethis.md
Last active June 5, 2024 16:03
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 acc
/*! 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