Skip to content

Instantly share code, notes, and snippets.

Avatar

Winston Chang wch

View GitHub Profile
@wch
wch / update.R
Created January 23, 2023 21:52
`stats::update()` weirdness
View update.R
# 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
wch / modify_expr.R
Last active January 13, 2023 21:30
Modify the body of a function programmatically
View modify_expr.R
# 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(
expr,
search_expr,
replace_expr
) {
if (typeof(expr) != "language") {
stop("modify_expr only works on language objects (AKA quoted expressions)!")
@wch
wch / app.R
Last active December 22, 2022 17:51
Test app for rstudio/shiny#3666
View app.R
# Test app for https://github.com/rstudio/shiny/pull/3666
# pkgload::load_all()
library(promises)
library(httpuv)
library(htmltools)
library(shiny)
library(later)
options(shiny.minified = FALSE)
@wch
wch / grow_vector.R
Last active October 28, 2022 00:42
Tests with growing vectors in a loop in R
View grow_vector.R
# The code below demonstrates that in R, growing a vector in a loop can be fast,
# as long as there is only reference to the object. When there's only one
# reference to the vector, R grows it in place (in most cases). However, if
# there are other references to the object, R must make a copy the object
# instead of growing it in place, leading to slower performance.
# =========================================================================
# Timing tests
# =========================================================================
@wch
wch / index.html
Last active June 2, 2022 17:16
blocks test
View index.html
This is a test, v2!
@wch
wch / web_repl.R
Last active April 25, 2022 19:15
Web page with REPL for R
View web_repl.R
# Web REPL/console
# Note: 127.0.0.1 allows connections only from localhost. To listen on external
# ports, use 0.0.0.0.
web_repl <- function(host = "127.0.0.1", port = 8080) {
library(httpuv)
app <- list(
call = function(req) {
@wch
wch / pluck_recursive.R
Created March 10, 2022 04:21
From a tree, recursively pluck all elements with a particular name
View pluck_recursive.R
# @drob's version from https://twitter.com/drob/status/1501747414780239879
pluck_recursive <- function(lst, name) {
if (is.list(lst)) {
if (!is.null(lst[[name]])) {
return(lst[[name]])
}
return(unname(unlist(purrr::map(lst, pluck_recursive, name))))
}
}
@wch
wch / mtime.R
Last active November 9, 2021 19:20
C function to get mtime of a file, from R
View mtime.R
library(inline)
get_mtime <- cfunction(
signature(filename = "character"),
includes = "
#include <time.h>
#include <sys/stat.h>",
body = '
const char* path = CHAR(asChar(filename));
struct stat attr;
stat(path, &attr);
@wch
wch / contextvars.py
Last active August 10, 2021 17:09
ContextVars demonstration
View contextvars.py
# Demonstration of using ContextVars instead of global variables.
# Set to True for global mode, False for ContextVar mode
global_mode = False
# With a global variable, the result is: 1 2 3 3 3 3 3 3 3
# With a ContextVar, the result is: 1 2 3 1 2 3 1 2 3
import asyncio
import contextvars
@wch
wch / later_test.R
Last active June 25, 2021 20:42
later callback execution order bug
View later_test.R
# This code uses later's C API to schedule callbacks as quickly as possible, and
# it tests if the callbacks execute in the same order that they are scheduled.
# In Docker on Mac, they sometimes do not.
docker run --rm -ti rocker/shiny /bin/bash
R
install.packages(c('cpp11', 'later', 'brio', 'callr', 'cli', 'decor', 'desc',
'tibble', 'vctrs'))
library(cpp11)