Skip to content

Instantly share code, notes, and snippets.

View wch's full-sized avatar

Winston Chang wch

View GitHub Profile
@wch
wch / rlang_function.R
Last active November 13, 2020 19:08
rlang::new_function() and rlang::as_function() with nested quosures
library(rlang)
library(pryr)
# ===========================
# Normal quosures
# ===========================
# as_function() with a quosure: OK
a <- 1
x <- quo(a + 10)
a <- 2
@wch
wch / memoise_async.R
Created October 22, 2020 23:00
Memoize async functions
library(digest)
library(promises)
library(cache)
# Given a list with items named `value` and `visible`, return `x$value` either
# visibly, or invisibly, depending on the value of `x$visible`.
valueWithVisible <- function(x) {
if (x$visible) x$value else invisible(x$value)
}
@wch
wch / memoize.R
Created September 11, 2020 17:56
Memoize performance tests
library(profvis)
library(microbenchmark)
library(memoise)
library(digest)
# Bare function
f <- function(a, b) {
a + b
}
@wch
wch / webapp.R
Created May 28, 2020 21:34
httpuv test app and curl fetch, in the same process
library(httpuv)
# Create a web server app which returns the time and prints out the value of
# a header named "test-header".
handle_request <- function(req) {
list(
status = 200L,
headers = list('Content-Type' = 'text/plain'),
body = paste0(
"The time is: ", Sys.time(), "\n",
@wch
wch / install_logs.txt
Created March 26, 2020 21:31
Rcpp and httpuv install logs
> install.packages("Rcpp")
Installing package into ‘/Users/winston/R/3.6’
(as ‘lib’ is unspecified)
trying URL 'https://cloud.r-project.org/bin/macosx/el-capitan/contrib/3.6/Rcpp_1.0.4.tgz'
Content type 'application/x-gzip' length 3124401 bytes (3.0 MB)
==================================================
downloaded 3.0 MB
The downloaded binary packages are in
@wch
wch / 00README.md
Created February 15, 2020 02:50
Calling R function from C

This is an example of C code calling an R function, by building a function call and then evaluating it.

@wch
wch / find_r_ver.R
Created September 16, 2019 21:08
Script for finding R version dependency
# First, need to install crandb
# devtools::install_github('r-hub/crandb')
# Memoize crandb::package because we end up making a lot of repetitive calls.
package <- memoise::memoise(crandb::package)
# Get a list of built-in packages. We don't need to check the version
# information for these packages.
builtin_pkgs <- memoise::memoise(function() {
pkgs <- installed.packages()
@wch
wch / remote_repl.R
Last active August 7, 2019 17:42
Remote R REPL app with httpuv
library(httpuv)
PORT <- 7000
app <- list(
call = function(req) {
page(req)
},
onWSOpen = function(ws) {
ws$onMessage(function(binary, message) {
@wch
wch / modify_vector.R
Created July 10, 2019 15:55
Modifying a vector in an object
## Modifying a vector in a parent environment
## This tests whether it's faster to use `self` or not, and whether it's faster to use `<-` vs `<<-`.
foo <- local({
x <- integer()
self <- environment()
# Four different ways of setting a value:
# * With and without using `self`
@wch
wch / symbol_table.R
Last active July 30, 2019 19:34
Get contents of R symbol table
# get_symbols() returns all symbols that are registered in R's symbol table.
#
# new_symbols() returns all symbols that have been added since the last time
# new_symbols() was run. If you want to test whether your code causes the symbol
# table to grow, run new_symbols(), then run your code, then run new_symbols()
# again.
get_symbols <- inline::cfunction(
includes = "
#define HSIZE 49157 /* The size of the hash table for symbols */