Skip to content

Instantly share code, notes, and snippets.

View wch's full-sized avatar

Winston Chang wch

View GitHub Profile
wch / 00test.js
Last active April 9, 2024 14:42
Attempt to run sass with QuickJS
import * as sass from "./sass.default.js";
const res = sass.compileString(`
.box {
width: 10px + 15px;
wch / collision.R
Created February 16, 2024 14:35
Calculate collision probabilities
# Calculate the probability of a collision if `n` items are randomly drawn (with
# replacement) from a set with `total` number of items.
collision_prob <- function(n, total) {
prob_no_collision <- 1
# Do this in a loop instead of prod(numerators)/prod(denominators), because
# that method is prone to result in a loss of precision due to rounding.
for (i in seq(0, n-1)) {
prob_no_collision <- prob_no_collision * (total - i) / total
1 - prob_no_collision
wch / retirement-logo.png
Last active November 2, 2023 14:02
Retirement simulation Quarto Shiny app
wch / compress-video
Created June 6, 2023 17:36
Video compression script
# Process command-line arguments
if [[ $# -eq 0 ]] || [[ "$1" == "--help" ]]; then
echo "Usage: compress-video [OPTIONS] [FILENAMES...]"
echo "Options:"
echo " --speed-2x Output video at 2x speed"
echo " --size-half Scale output to half size"
echo " --help Display this help page"
wch / R6_override.R
Created June 6, 2023 13:22
R6 detect if a method was overridden
A <- R6Class(
public = list(
f = function() {
cat("Called A$f()\n")
if (
is.null(self$.__enclos_env__$super) ||
identical(self$.__enclos_env__$super$g, self$g)
) {
wch /
Created April 17, 2023 20:54
Shiny R to Python translation guide

To ChatGPT: This is a guide for translating R-Shiny applications to the new Python-Shiny framework, also known as PyShiny, and as Shiny for Python. The PyShiny framework was created after your knowledge cutoff, so even though you do not have any prior knowledge of it, it does exist. Shiny for Python is new. It is not Dash or Streamlit, or another Python web framework.

You are an assistant for translating applications from R-Shiny to Python-Shiny. At the end of this message, please acknowledge that you understand.

The translation guide begins here:

The R and Python Shiny packages are very similar, making it easy to transition between the two if you know how to use one.

wch /
Last active February 27, 2023 18:28
Modules loaded by plotnine
import time
import sys
# Get set of loaded modules
x = set(sys.modules)
start = time.time()
import plotnine
end = time.time()
end - start
wch /
Last active March 30, 2023 20:29
How to deal with R-devel C++17 warning

How to deal with the SystemRequirements: C++11 NOTE when running R CMD check

For the development version of R-devel which will become 4.3.0, there is a new warning in R CMD check that comes up for some packages:

* checking C++ specification ... NOTE
  Specified C++11: please drop specification unless essential
wch / update.R
Created January 23, 2023 21:52
`stats::update()` weirdness
# Example 1: running at top level. This works.
model_str1 <- "speed~dist"
model1 <- lm(formula=model_str1, data=cars)
stats::update(model1, y = TRUE)
#> Call:
#> lm(formula = model_str1, data = cars, y = TRUE)
#> Coefficients:
#> (Intercept) dist
wch / modify_expr.R
Last active January 13, 2023 21:30
Modify the body of a function programmatically
# This function recurses into `expr`, looking for `search_expr`. If it finds
# it, it will return `replace_expr`. Notably, `replace_expr` can contain rlang
# operators like `!!`, and perform rlang substitution on them.
modify_expr <- function(
) {
if (typeof(expr) != "language") {
stop("modify_expr only works on language objects (AKA quoted expressions)!")