diff --git a/CV_printing_functions.R b/CV_printing_functions.R
new file mode 100644
index 0000000..c3b1d9e
--- /dev/null
+++ b/CV_printing_functions.R
@@ -0,0 +1,255 @@
+# This file contains all the code needed to parse and print various sections of your CV
+# from data. Feel free to tweak it as you desire!
+
+
+#' Create a CV_Printer object.
+#'
+#' @param data_location Path of the spreadsheets holding all your data. This can be
+#' either a URL to a google sheet with multiple sheets containing the four
+#' data types or a path to a folder containing four `.csv`s with the neccesary
+#' data.
+#' @param pdf_location What location will the PDF of this CV be hosted at?
+#' @param html_location What location will the HTML version of this CV be hosted at?
+#' @param source_location Where is the code to build your CV hosted?
+#' @param pdf_mode Is the output being rendered into a pdf? Aka do links need
+#' to be stripped?
+#' @param sheet_is_publicly_readable If you're using google sheets for data,
+#' is the sheet publicly available? (Makes authorization easier.)
+#' @return A new `CV_Printer` object.
+create_CV_object <- function(data_location,
+ pdf_mode = FALSE,
+ html_location,
+ pdf_location,
+ sheet_is_publicly_readable = TRUE) {
+
+ cv <- list(
+ pdf_mode = pdf_mode,
+ html_location = html_location,
+ pdf_location = pdf_location,
+ links = c()
+ )
+
+ is_google_sheets_location <- stringr::str_detect(data_location, "docs\\.google\\.com")
+
+ if(is_google_sheets_location){
+ if(sheet_is_publicly_readable){
+ # This tells google sheets to not try and authenticate. Note that this will only
+ # work if your sheet has sharing set to "anyone with link can view"
+ googlesheets4::sheets_deauth()
+ } else {
+ # My info is in a public sheet so there's no need to do authentication but if you want
+ # to use a private sheet, then this is the way you need to do it.
+ # designate project-specific cache so we can render Rmd without problems
+ options(gargle_oauth_cache = ".secrets")
+ }
+
+ cv$entries_data <- googlesheets4::read_sheet(data_location, sheet = "entries", skip = 1) %>%
+ # Google sheets loves to turn columns into list ones if there are different types
+ dplyr::mutate_if(is.list, purrr::map_chr, as.character)
+
+ cv$skills <- googlesheets4::read_sheet(data_location, sheet = "language_skills", skip = 1)
+ cv$text_blocks <- googlesheets4::read_sheet(data_location, sheet = "text_blocks", skip = 1)
+ cv$contact_info <- googlesheets4::read_sheet(data_location, sheet = "contact_info", skip = 1)
+ } else {
+ # Want to go old-school with csvs?
+ cv$entries_data <- readr::read_csv(paste0(data_location, "entries.csv"))
+ cv$skills <- readr::read_csv(paste0(data_location, "language_skills.csv"))
+ cv$text_blocks <- readr::read_csv(paste0(data_location, "text_blocks.csv"))
+ cv$contact_info <- readr::read_csv(paste0(data_location, "contact_info.csv"), skip = 1)
+ }
+
+
+ # This year is assigned to the end date of "current" events to make sure they get sorted later.
+ future_year <- lubridate::year(lubridate::ymd(Sys.Date())) + 10
+
+ # Clean up entries dataframe to format we need it for printing
+ cv$entries_data %<>%
+ tidyr::unite(
+ tidyr::starts_with('description'),
+ col = "description_bullets",
+ sep = "\n- ",
+ na.rm = TRUE
+ ) %>%
+ dplyr::mutate(
+ description_bullets = paste0("- ", description_bullets),
+ end = ifelse(is.na(end), "Current", end),
+ end_num = ifelse(tolower(end) %in% c("current", "now", ""), future_year, end),
+ timeline = ifelse(is.na(start) | start == end,
+ end,
+ glue::glue('{end} - {start}'))
+ ) %>%
+ dplyr::arrange(desc(end_num)) %>%
+ dplyr::mutate_all(~ ifelse(is.na(.), 'N/A', .))
+
+ cv
+}
+
+
+# Remove links from a text block and add to internal list
+sanitize_links <- function(cv, text){
+ if(cv$pdf_mode){
+ link_titles <- stringr::str_extract_all(text, '(?<=\\[).+?(?=\\])')[[1]]
+ link_destinations <- stringr::str_extract_all(text, '(?<=\\().+?(?=\\))')[[1]]
+
+ n_links <- length(cv$links)
+ n_new_links <- length(link_titles)
+
+ if(n_new_links > 0){
+ # add links to links array
+ cv$links <- c(cv$links, link_destinations)
+
+ # Build map of link destination to superscript
+ link_superscript_mappings <- purrr::set_names(
+ paste0("", (1:n_new_links) + n_links, ""),
+ paste0("(", link_destinations, ")")
+ )
+
+ # Replace the link destination and remove square brackets for title
+ text <- text %>%
+ stringr::str_replace_all(stringr::fixed(link_superscript_mappings)) %>%
+ stringr::str_replace_all('\\[(.+?)\\]', "\\1")
+ }
+ }
+
+ list(cv = cv, text = text)
+}
+
+
+#' @description Take a position data frame and the section id desired and prints the section to markdown.
+#' @param section_id ID of the entries section to be printed as encoded by the `section` column of the `entries` table
+print_section <- function(cv, section_id, glue_template = "default"){
+
+ if(glue_template == "default"){
+ glue_template <- "
+### {title}
+
+{loc}
+
+{institution}
+
+{timeline}
+
+{description_bullets}
+\n\n\n"
+ }
+
+ section_data <- dplyr::filter(cv$entries_data, section == section_id)
+
+ # Take entire entries data frame and removes the links in descending order
+ # so links for the same position are right next to each other in number.
+ for(i in 1:nrow(section_data)){
+ for(col in c('title', 'description_bullets')){
+ strip_res <- sanitize_links(cv, section_data[i, col])
+ section_data[i, col] <- strip_res$text
+ cv <- strip_res$cv
+ }
+ }
+
+ print(glue::glue_data(section_data, glue_template))
+
+ invisible(strip_res$cv)
+}
+
+
+
+#' @description Prints out text block identified by a given label.
+#' @param label ID of the text block to print as encoded in `label` column of `text_blocks` table.
+print_text_block <- function(cv, label){
+ text_block <- dplyr::filter(cv$text_blocks, loc == label) %>%
+ dplyr::pull(text)
+
+ strip_res <- sanitize_links(cv, text_block)
+
+ cat(strip_res$text)
+
+ invisible(strip_res$cv)
+}
+
+
+
+#' @description Construct a bar chart of skills
+#' @param out_of The relative maximum for skills. Used to set what a fully filled in skill bar is.
+print_skill_bars <- function(cv, out_of = 5, bar_color = "#969696", bar_background = "#d9d9d9", glue_template = "default"){
+
+ if(glue_template == "default"){
+ glue_template <- "
+
{skill}
"
+ }
+ cv$skills %>%
+ dplyr::mutate(width_percent = round(100*level/out_of)) %>%
+ glue::glue_data(glue_template) %>%
+ print()
+
+ invisible(cv)
+}
+
+
+
+#' @description List of all links in document labeled by their superscript integer.
+print_links <- function(cv) {
+ n_links <- length(cv$links)
+ if (n_links > 0) {
+ cat("
+Links {data-icon=link}
+--------------------------------------------------------------------------------
+
+
+
+
+")
+
+ purrr::walk2(cv$links, 1:n_links, function(link, index) {
+ print(glue::glue('{index}. {link}'))
+ })
+ }
+
+ invisible(cv)
+}
+
+
+
+#' @description Contact information section with icons
+print_contact_info <- function(cv){
+ glue::glue_data(
+ cv$contact_info,
+ "- {contact}"
+ ) %>% print()
+
+ invisible(cv)
+}
+
+
+
+#' @description Small addendum that links to pdf version of CV if currently HTML and HTML if currently PDF.
+print_link_to_other_format <- function(cv){
+ # When in export mode the little dots are unaligned, so fix that.
+ if(cv$pdf_mode){
+ print(glue::glue("View this CV online with links at _{cv$html_location}_"))
+ } else {
+ print(glue::glue("[ Download a PDF of this CV]({cv$pdf_location})"))
+ }
+
+ invisible(cv)
+}
+
+
+
+#' @description Appends some styles specific to PDF output.
+set_style <- function(cv){
+ # When in export mode the little dots are unaligned, so fix that.
+ if(cv$pdf_mode) {
+ cat("
+")
+ }
+
+invisible(cv)
+}
diff --git a/csvs/contact_info.csv b/csvs/contact_info.csv
deleted file mode 100644
index 7f9729c..0000000
--- a/csvs/contact_info.csv
+++ /dev/null
@@ -1,6 +0,0 @@
-,Icon used from font-awesome 4 to label this contact section,The actual value written for the contact entry
-loc,icon,contact
-email,envelope,nick.strayer@gmail.com
-twitter,twitter,NicholasStrayer
-github,github,github.com/nstrayer
-website,link,nickstrayer.me
\ No newline at end of file
diff --git a/csvs/language_skills.csv b/csvs/language_skills.csv
deleted file mode 100644
index 819b93e..0000000
--- a/csvs/language_skills.csv
+++ /dev/null
@@ -1,8 +0,0 @@
-skill,level
-R,5
-Javascript (d3.js),4.5
-C++,4
-Python,4
-Bash,3.5
-SQL,3
-AWK,3
\ No newline at end of file
diff --git a/csvs/positions.csv b/csvs/positions.csv
deleted file mode 100644
index 8b5b8d1..0000000
--- a/csvs/positions.csv
+++ /dev/null
@@ -1,46 +0,0 @@
-section,in_resume,title,loc,institution,start,end,description_1,description_2,description_3
-education,TRUE,"PhD. Candidate, Biostatistics",Vanderbilt University,"Nashville, TN",2015,2020,Working on Bayesian network models & interactive visualization platforms,University Graduate Fellow,
-education,TRUE,"B.S., Mathematics, Statistics (minor C.S.)",University of Vermont,"Burlington, VT",2011,2015,Thesis: An agent based model of Diel Vertical Migration patterns of Mysis diluviana,,
-research_positions,FALSE,Research Assistant,Adair Laboratory,University of Vermont,2012,2013,Independently analyzed and constructed statistical models for large data sets pertaining to carbon decomposition rates.,,
-research_positions,FALSE,Undergraduate Researcher,Bentil Laboratory,University of Vermont,2013,2014,Developed mathematical model to predict the transport of sulfur through the environment with applications in waste cleanup.,,
-research_positions,FALSE,Undergraduate Researcher,Rubenstein Ecosystems Science Laboratory,University of Vermont,2013,2015,Analyzed and visualized data for CATOS fish tracking project.,Head of data mining project to establish temporal trends in population densities of Mysis diluviana (Mysis).,Ran project to mathematically model the migration patterns of Mysis (honors thesis project.)
-research_positions,FALSE,Human Computer Interaction Researcher,LabInTheWild (Reineke Lab),University of Michigan,2015,2015,Led development and implementation of interactive data visualizations to help users compare themselves to other demographics.,,
-research_positions,TRUE,Graduate Research Assistant,TBILab (Yaomin Xu's Lab),Vanderbilt University,2015,2020,Primarily working with large EHR and Biobank datasets.,Developing network-based methods to investigate and visualize clinically relevant patterns in data.,
-research_positions,TRUE,Data Science Researcher,Data Science Lab,Johns Hopkins University,2017,2018,Building R Shiny applications in the contexts of wearables and statistics education.,Work primarily done in R Shiny and Javascript (node and d3js).,
-industry_positions,FALSE,Software Engineering Intern,Conduce,"Carpinteria, CA",2014,2014,Incorporated d3.js to the company's main software platform.,,
-industry_positions,FALSE,Engineering Intern - User Experience,Dealer.com,"Burlington, VT",2015,2015,Built internal tool to help analyze and visualize user interaction with back-end products.,,
-industry_positions,FALSE,Data Science Intern,Dealer.com,"Burlington, VT",2015,2015,Worked with the product analytics team to help parse and visualize large stores of data to drive business decisions.,,
-industry_positions,FALSE,Data Artist In Residence,Conduce,"Carpinteria, CA",2014,2015,"Envisioned, prototyped and implemented visualization framework in the course of one month.",Constructed training protocol for bringing third parties up to speed with new protocol.,
-industry_positions,TRUE,Data Journalist - Graphics Department,New York Times,"New York, New York",2016,2016,"Reporter with the graphics desk covering topics in science, politics, and sport.","Work primarily done in R, Javascript, and Adobe Illustrator.",
-teaching_positions,FALSE,Javascript for Shiny Users,RStudio::conf 2020,NA,,2020,Served as TA for two day workshop on how to leverage Javascript in Shiny applications,Lectured on [using R2D3 package to build interactive visualizations.](http://nickstrayer.me/js4shiny_r2d3/slides),
-teaching_positions,FALSE,Statistical Computing in R,Vanderbilt Biostatistics Department,"Nashville, TN",2017,2017,TA and lectured,Covered introduction to R language for statistics applications,Graduate level class
-teaching_positions,FALSE,Advanced Statistical Learning and Inference,Vanderbilt Biostatistics Department,"Nashville, TN",2017,2018,TA and lectured,Topics covered from penalized regression to boosted trees and neural networks,Highest level course offered in department
-teaching_positions,FALSE,Advanced Statistical Computing,Vanderbilt Biostatistics Department,"Nashville, TN",2018,2018,TA and lectured,Covered modern statistical computing algorithms,4th year PhD level class
-teaching_positions,FALSE,Data Visualization Best Practices,DataCamp,,2019,2019,Designed from bottom up course to teach best practices for scientific visualizations.,Uses R and ggplot2.,In top 10% on platform by popularity.
-teaching_positions,FALSE,Improving your visualization in Python,DataCamp,,2019,2019,Designed from bottom up course to teach advanced methods for enhancing visualization.,"Uses python, matplotlib, and seaborn.",
-data_science_writings,FALSE,[Classifying physical activity from smartphone data](https://blogs.rstudio.com/tensorflow/posts/2018-07-17-activity-detection/),RStudio Tensorflow Blog,,,2018,Walk through of training a convolutional neural network to achieve state of the art recognition of activities from accelerometer data.,Contracted article.,
-data_science_writings,TRUE,[Using AWK and R to Parse 25tb](https://livefreeordichotomize.com/2019/06/04/using_awk_and_r_to_parse_25tb/),LiveFreeOrDichotomize.com,,,2019,Story of parsing large amounts of genomics data.,Provided advice for dealing with data much larger than disk.,Reached top of HackerNews.
-data_science_writings,FALSE,[The United States of Seasons](https://livefreeordichotomize.com/2018/02/12/the-united-states-of-seasons/),LiveFreeOrDichotomize.com,,,2018,GIS analysis of weather data to find the most 'seasonal' locations in United States,Used Bayesian regression methods for smoothing sparse geospatial data.,
-data_science_writings,FALSE,[A year as told by fitbit](https://livefreeordichotomize.com/2017/12/27/a-year-as-told-by-fitbit/),LiveFreeOrDichotomize.com,,,2017,Analyzing a full years worth of second-level heart rate data from wearable device.,Demonstrated visualization-based inference for large data.,
-data_science_writings,FALSE,[MCMC and the case of the spilled seeds](https://livefreeordichotomize.com/2017/10/14/mcmc-and-the-case-of-the-spilled-seeds/),LiveFreeOrDichotomize.com,,,2017,Full Bayesian MCMC sampler running in your browser.,Coded from scratch in vanilla Javascript.,
-data_science_writings,TRUE,[The Traveling Metallurgist](https://livefreeordichotomize.com/2017/09/25/the-traveling-metallurgist/),LiveFreeOrDichotomize.com,,,2017,Pure javascript implementation of traveling salesman solution using simulated annealing.,Allows reader to customize the number and location of cities to attempt to trick the algorithm.,
-about_me_press,FALSE,[Great paper? Swipe right on the new ‘Tinder for preprints’ app](https://www.sciencemag.org/news/2017/06/great-paper-swipe-right-new-tinder-preprints-app),Science,,2017,2017,Story of the app [Papr](https://jhubiostatistics.shinyapps.io/papr/) made with Jeff Leek and Lucy D’Agostino McGowan.,,
-about_me_press,FALSE,[Swipe right for science: Papr app is ‘Tinder for preprints’](https://www.nature.com/news/swipe-right-for-science-papr-app-is-tinder-for-preprints-1.22163),Nature News,,2017,2017,Second press article for app Papr.,,
-about_me_press,FALSE,[The Deeper Story in the Data](https://www.uvm.edu/uvmnews/news/deeper-story-data),University of Vermont Quarterly,,2016,2016,Story on my path post graduation and the power of narrative.,,
-by_me_press,TRUE,[The Great Student Migration](https://www.nytimes.com/interactive/2016/08/26/us/college-student-migration.html?smid=pl-share),The New York Times,,2016,2016,Most shared and discussed article from the New York Times for August 2016.,,
-by_me_press,FALSE,"[Wildfires are Getting Worse, The New York Times](https://www.nytimes.com/interactive/2016/07/25/us/wildfire-seasons-los-angeles.html)",The New York Times,,2016,2016,GIS analysis and modeling of fire patterns and trends,Data in collaboration with NASA and USGS,
-by_me_press,FALSE,[Who’s Speaking at the Democratic National Convention?](https://www.nytimes.com/2016/07/26/upshot/democrats-may-not-be-unified-but-their-convention-speakers-are.html),The New York Times,,2016,2016,Data scraped from CSPAN records to figure out who talked and past conventions.,,
-by_me_press,FALSE,[Who’s Speaking at the Republican National Convention?](https://www.nytimes.com/2016/07/19/upshot/whos-not-speaking-how-this-republican-convention-differs.html?smid=pl-share),The New York Times,,2016,2016,Used same data scraping techniques as Who’s Speaking at the Democratic National Convention?,,
-by_me_press,FALSE,"[A Trail of Terror in Nice, Block by Block](https://www.nytimes.com/interactive/2016/07/14/world/europe/trail-of-terror-france.html)",The New York Times,,2016,2016,"Led research effort to put together story of 2016 terrorist attack in Nice, France in less than 12 hours.","Work won Silver medal at Malofiej 2017, and gold at Society of News and Design.",
-academic_articles,TRUE,Asymmetric Linkage Disequilibrium: Tools for Dissecting Multiallelic LD,Journal of Human Immunology,,2015,2015,"Authored with Richard Single, Vanja Paunic, Mark Albrecht, and Martin Maiers.",,
-academic_articles,FALSE,[An Agent Based Model of Mysis Migration](https://www.semanticscholar.org/paper/An-Agent-Based-Model-of-the-Diel-Vertical-Migration-Strayer-Stockwell/40493c78e8ecf22bd882d17ec99fd913ec4b9820),International Association of Great Lakes Research Conference,,2015,2015,"Authored with Brian O'Malley, Sture Hansson, and Jason Stockwell.",,
-academic_articles,FALSE,Declines of Mysis diluviana in the Great Lakes,Journal of Great Lakes Research,,2015,2015,Authored with Peter Euclide and Jason Stockwell.,,
-academic_articles,FALSE,[Continuous Classification using Deep Neural Networks](http://nickstrayer.me/qualifying_exam/),Vanderbilt Biostatistics Qualification Exam,,2017,2017,Review of methods for classifying continuous data streams using neural networks,Successfully met qualifying examination standards,
-academic_articles,TRUE,[Charge Reductions Associated with Shortening Time to Recovery in Septic Shock](https://www.ncbi.nlm.nih.gov/pubmed/30419234),Chest,,2019,2019,"Authored with Wesley H. Self, MD MPH; Dandan Liu, PhD; Stephan Russ, MD, MPH; Michael J. Ward, MD, PhD, MBA; Nathan I. Shapiro, MD, MPH; Todd W. Rice, MD, MSc; Matthew W. Semler, MD, MSc.",,
-academic_articles,FALSE,R timelineViz: Visualizing the distribution of study events in longitudinal studies,Under-Review (copy available upon request.),,2018,2018,Authored with Alex Sunderman of the Vanderbilt Department of Epidemiology.,,
-academic_articles,TRUE,[Multimorbidity Explorer | A shiny app for exploring EHR and biobank data](http://nickstrayer.me/rstudioconf19_me-poster/),RStudio::conf 2019,,2019,2019,Contributed Poster. Authored with Yaomin Xu.,,
-academic_articles,FALSE,[Taking a network view of EHR and Biobank data to find explainable multivariate patterns](http://nickstrayer.me/biostat_seminar/),Vanderbilt Biostatistics Seminar Series,,2019,2019,University wide seminar series.,,
-academic_articles,FALSE,Patient-specific risk factors independently influence survival in Myelodysplastic Syndromes in an unbiased review of EHR records,Under-Review (copy available upon request.),,,2019,Bayesian network analysis used to find novel subgroups of patients with Myelodysplastic Syndromes (MDS).,Analysis done using method built for my dissertation.,
-academic_articles,FALSE,Building a software package in tandem with machine learning methods research can result in both more rigorous code and more rigorous research,ENAR 2020,,,2020,Invited talk in Human Data Interaction section.,How and why building an R package can benefit methodological research,
-academic_articles,TRUE,"[Stochastic Block Modeling in R, Statistically rigorous clustering with rigorous code](http://nickstrayer.me/rstudioconf_sbm)",RStudio::conf 2020,,,2020,Invited talk about new [sbmR package](https://tbilab.github.io/sbmR/).,Focus on how software development and methodological research can improve both benefit when done in tandem.,
-academic_articles,FALSE,Patient specific comorbidities impact overall survival in myelofibrosis,Under-Review (copy available upon request.),,,2019,Bayesian network analysis used to find robust novel subgroups of patients with given genetic mutations.,Analysis done using method built for my dissertation.,
\ No newline at end of file
diff --git a/csvs/text_blocks.csv b/csvs/text_blocks.csv
deleted file mode 100644
index 77f3592..0000000
--- a/csvs/text_blocks.csv
+++ /dev/null
@@ -1,7 +0,0 @@
-loc,text
-intro,"I have made [visualizations viewed by hundreds of thousands of people](https://www.nytimes.com/interactive/2016/08/26/us/college-student-migration.html), [sped up query times for 25 terabytes of data by an average of 4,800 times](https://livefreeordichotomize.com/2019/06/04/using_awk_and_r_to_parse_25tb/), and built [packages for R](https://github.com/nstrayer/shinysense) that let you [do magic](http://nickstrayer.me/dataDayTexas/).
-
-Currently searching for a position that allows me to build tools leveraging a combination of visualization, machine learning, and software engineering to help people explore and understand their data in new and useful ways."
-industy_experience_aside,I have worked in a variety of roles ranging from journalist to software engineer to data scientist. I like collaborative environments where I can learn from my peers.
-teaching_experience_aside,I am passionate about education. I believe that no topic is too complex if the teacher is empathetic and willing to think about new methods of approaching task.
-data_science_writing_aside,I regularly blog about data science and visualization on my blog [LiveFreeOrDichotomize.](https://livefreeordichotomize.com/)
\ No newline at end of file
diff --git a/cv.Rmd b/cv.Rmd
index 72789f3..95ce9f1 100644
--- a/cv.Rmd
+++ b/cv.Rmd
@@ -11,56 +11,51 @@ output:
self_contained: true
---
-```{r setup, include=FALSE}
+```{r, include=FALSE}
knitr::opts_chunk$set(
results='asis',
echo = FALSE
)
-library(tidyverse)
-library(magrittr)
-```
-```{r, cache = TRUE, include = FALSE}
-# Using an in-development package for building these cvs. Install with
-# devtools::install_github("nstrayer/datadrivencv")
+library(magrittr) # For the pipe
+source("CV_printing_functions.R")
# Read in all data and initialize a CV printer object
-cv_printer <- datadrivencv::CV_Printer$new(
+CV <- create_CV_object(
data_location = "https://docs.google.com/spreadsheets/d/14MQICF2F8-vf8CKPF1m4lyGKO6_thG-4aSwat1e2TWc",
pdf_location = "https://github.com/nstrayer/cv/raw/master/strayer_cv.pdf",
- html_location = "nickstrayer.me/cv/")
+ html_location = "nickstrayer.me/cv/",
+ pdf_mode = params$pdf_mode
+)
+
```
```{r}
-# This toggles if output is rendered in PDF format or HTML
-cv_printer$set_pdf_mode(params$pdf_mode)
-
# Add some conditional CSS if in PDF mode needed due to quirks in chrome print rendering
-cv_printer$set_style()
+CV %>% set_style()
```
Aside
================================================================================
-
```{r}
-datadrivencv::build_network_logo(cv_printer$position_data)
+# Build interactive network of positions colored by section
+# and connected if they occurred in the same year
+datadrivencv::build_network_logo(CV$entries_data)
```
-
-
```{r}
-cv_printer$print_link_to_other_format()
+CV %>% print_link_to_other_format()
```
Contact {#contact}
--------------------------------------------------------------------------------
```{r}
-cv_printer$print_contact_info()
+CV %>% print_contact_info()
```
@@ -69,7 +64,7 @@ Language Skills {#skills}
--------------------------------------------------------------------------------
```{r}
-cv_printer$print_skill_bars()
+CV %>% print_skill_bars()
```
@@ -92,7 +87,8 @@ Nick Strayer {#title}
--------------------------------------------------------------------------------
```{r}
-cv_printer$print_text_block("intro")
+# Note the special double pipe so we modify the CV object in place
+CV %<>% print_text_block("intro")
```
@@ -101,7 +97,7 @@ Education {data-icon=graduation-cap data-concise=true}
--------------------------------------------------------------------------------
```{r}
-cv_printer$print_section('education')
+CV %<>% print_section('education')
```
@@ -110,7 +106,7 @@ Research Experience {data-icon=laptop}
--------------------------------------------------------------------------------
```{r}
-cv_printer$print_section('research_positions')
+CV %<>% print_section('research_positions')
```
@@ -120,12 +116,12 @@ Industry Experience {data-icon=suitcase}
::: aside
```{r}
-cv_printer$print_text_block('industy_experience_aside')
+CV %<>% print_text_block('industy_experience_aside')
```
:::
```{r}
-cv_printer$print_section('industry_positions')
+CV %<>% print_section('industry_positions')
```
@@ -138,12 +134,12 @@ Teaching Experience {data-icon=chalkboard-teacher}
::: aside
```{r}
-cv_printer$print_text_block('teaching_experience_aside')
+CV %<>% print_text_block('teaching_experience_aside')
```
:::
```{r}
-cv_printer$print_section('teaching_positions')
+CV %<>% print_section('teaching_positions')
```
@@ -153,12 +149,12 @@ Selected Data Science Writing {data-icon=chart-line}
::: aside
```{r}
-cv_printer$print_text_block('data_science_writing_aside')
+CV %<>% print_text_block('data_science_writing_aside')
```
:::
```{r}
-cv_printer$print_section('data_science_writings')
+CV %<>% print_section('data_science_writings')
```
@@ -167,7 +163,7 @@ Selected Press (About) {data-icon=newspaper}
--------------------------------------------------------------------------------
```{r}
-cv_printer$print_section('about_me_press')
+CV %<>% print_section('about_me_press')
```
@@ -179,7 +175,7 @@ Selected Press (By) {data-icon=newspaper}
--------------------------------------------------------------------------------
```{r}
-cv_printer$print_section('by_me_press')
+CV %<>% print_section('by_me_press')
```
@@ -188,12 +184,11 @@ Selected Publications, Posters, and Talks {data-icon=book}
--------------------------------------------------------------------------------
```{r}
-cv_printer$print_section('academic_articles')
+CV %<>% print_section('academic_articles')
```
```{r}
-cv_printer$print_links()
+CV %<>% print_links()
```
-
diff --git a/cv.html b/cv.html
deleted file mode 100644
index 6b1f8ef..0000000
--- a/cv.html
+++ /dev/null
@@ -1,30988 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- Nick Strayer’s CV
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Aside
-
-
-
-
-
View this CV online with links at nickstrayer.me/cv/
I have made visualizations viewed by hundreds of thousands of people1, sped up query times for 25 terabytes of data by an average of 4,800 times2, and built packages for R3 that let you do magic4.
-
Currently searching for a position that allows me to build tools leveraging a combination of visualization, machine learning, and software engineering to help people explore and understand their data in new and useful ways.
-
-
-
Education
-
-
PhD. Candidate, Biostatistics
-
Vanderbilt University
-
Nashville, TN
-
Current - 2015
-
-
Working on Bayesian network models & interactive visualization platforms
-
University Graduate Fellow
-
-
-
-
B.S., Mathematics, Statistics (minor C.S.)
-
University of Vermont
-
Burlington, VT
-
2015 - 2011
-
-
Thesis: An agent based model of Diel Vertical Migration patterns of Mysis diluviana
-
-
-
-
-
Research Experience
-
-
Graduate Research Assistant
-
TBILab (Yaomin Xu’s Lab)
-
Vanderbilt University
-
Current - 2015
-
-
Primarily working with large EHR and Biobank datasets.
-
Developing network-based methods to investigate and visualize clinically relevant patterns in data.
-
-
-
-
Data Science Researcher
-
Data Science Lab
-
Johns Hopkins University
-
2018 - 2017
-
-
Building R Shiny applications in the contexts of wearables and statistics education.
-
Work primarily done in R Shiny and Javascript (node and d3js).
-
-
-
-
Undergraduate Researcher
-
Rubenstein Ecosystems Science Laboratory
-
University of Vermont
-
2015 - 2013
-
-
Analyzed and visualized data for CATOS fish tracking project.
-
Head of data mining project to establish temporal trends in population densities of Mysis diluviana (Mysis).
-
Ran project to mathematically model the migration patterns of Mysis (honors thesis project.)
-
-
-
-
Human Computer Interaction Researcher
-
LabInTheWild (Reineke Lab)
-
University of Michigan
-
2015
-
-
Led development and implementation of interactive data visualizations to help users compare themselves to other demographics.
-
-
-
-
Undergraduate Researcher
-
Bentil Laboratory
-
University of Vermont
-
2014 - 2013
-
-
Developed mathematical model to predict the transport of sulfur through the environment with applications in waste cleanup.
-
-
-
-
Research Assistant
-
Adair Laboratory
-
University of Vermont
-
2013 - 2012
-
-
Independently analyzed and constructed statistical models for large data sets pertaining to carbon decomposition rates.
-
-
-
-
-
Industry Experience
-
-
I have worked in a variety of roles ranging from journalist to software engineer to data scientist. I like collaborative environments where I can learn from my peers.
-
-
-
Data Journalist - Graphics Department
-
New York Times
-
New York, New York
-
2016
-
-
Reporter with the graphics desk covering topics in science, politics, and sport.
-
Work primarily done in R, Javascript, and Adobe Illustrator.
-
-
-
-
Engineering Intern - User Experience
-
Dealer.com
-
Burlington, VT
-
2015
-
-
Built internal tool to help analyze and visualize user interaction with back-end products.
-
-
-
-
Data Science Intern
-
Dealer.com
-
Burlington, VT
-
2015
-
-
Worked with the product analytics team to help parse and visualize large stores of data to drive business decisions.
-
-
-
-
Data Artist In Residence
-
Conduce
-
Carpinteria, CA
-
2015 - 2014
-
-
Envisioned, prototyped and implemented visualization framework in the course of one month.
-
Constructed training protocol for bringing third parties up to speed with new protocol.
-
-
-
-
Software Engineering Intern
-
Conduce
-
Carpinteria, CA
-
2014
-
-
Incorporated d3.js to the company’s main software platform.
-
-
-
-
-
-
-
-
-
Teaching Experience
-
-
I am passionate about education. I believe that no topic is too complex if the teacher is empathetic and willing to think about new methods of approaching task.
-
-
-
Javascript for Shiny Users
-
RStudio::conf 2020
-
N/A
-
2020
-
-
Served as TA for two day workshop on how to leverage Javascript in Shiny applications
-
Lectured on using R2D3 package to build interactive visualizations.5
-
-
-
-
Data Visualization Best Practices
-
DataCamp
-
N/A
-
2019
-
-
Designed from bottom up course to teach best practices for scientific visualizations.
-
Uses R and ggplot2.
-
In top 10% on platform by popularity.
-
-
-
-
Improving your visualization in Python
-
DataCamp
-
N/A
-
2019
-
-
Designed from bottom up course to teach advanced methods for enhancing visualization.
-
Uses python, matplotlib, and seaborn.
-
-
-
-
Advanced Statistical Learning and Inference
-
Vanderbilt Biostatistics Department
-
Nashville, TN
-
2018 - 2017
-
-
TA and lectured
-
Topics covered from penalized regression to boosted trees and neural networks
-
Highest level course offered in department
-
-
-
-
Advanced Statistical Computing
-
Vanderbilt Biostatistics Department
-
Nashville, TN
-
2018
-
-
TA and lectured
-
Covered modern statistical computing algorithms
-
4th year PhD level class
-
-
-
-
Statistical Computing in R
-
Vanderbilt Biostatistics Department
-
Nashville, TN
-
2017
-
-
TA and lectured
-
Covered introduction to R language for statistics applications
-
Graduate level class
-
-
-
-
-
Selected Data Science Writing
-
-
I regularly blog about data science and visualization on my blog LiveFreeOrDichotomize.6
-
-
-
Using AWK and R to Parse 25tb7
-
LiveFreeOrDichotomize.com
-
N/A
-
2019
-
-
Story of parsing large amounts of genomics data.
-
Provided advice for dealing with data much larger than disk.
-
Reached top of HackerNews.
-
-
-
-
Classifying physical activity from smartphone data8
-
RStudio Tensorflow Blog
-
N/A
-
2018
-
-
Walk through of training a convolutional neural network to achieve state of the art recognition of activities from accelerometer data.
-
Contracted article.
-
-
-
-
The United States of Seasons9
-
LiveFreeOrDichotomize.com
-
N/A
-
2018
-
-
GIS analysis of weather data to find the most ‘seasonal’ locations in United States
-
Used Bayesian regression methods for smoothing sparse geospatial data.
-
-
-
-
A year as told by fitbit10
-
LiveFreeOrDichotomize.com
-
N/A
-
2017
-
-
Analyzing a full years worth of second-level heart rate data from wearable device.
-
Demonstrated visualization-based inference for large data.
-
-
-
-
MCMC and the case of the spilled seeds11
-
LiveFreeOrDichotomize.com
-
N/A
-
2017
-
-
Full Bayesian MCMC sampler running in your browser.
-
Coded from scratch in vanilla Javascript.
-
-
-
-
The Traveling Metallurgist12
-
LiveFreeOrDichotomize.com
-
N/A
-
2017
-
-
Pure javascript implementation of traveling salesman solution using simulated annealing.
-
Allows reader to customize the number and location of cities to attempt to trick the algorithm.
-
-
-
-
-
Selected Press (About)
-
-
Great paper? Swipe right on the new ‘Tinder for preprints’ app13
-
Science
-
N/A
-
2017
-
-
Story of the app Papr14 made with Jeff Leek and Lucy D’Agostino McGowan.
-
-
-
-
Swipe right for science: Papr app is ‘Tinder for preprints’15
-
Nature News
-
N/A
-
2017
-
-
Second press article for app Papr.
-
-
-
-
The Deeper Story in the Data16
-
University of Vermont Quarterly
-
N/A
-
2016
-
-
Story on my path post graduation and the power of narrative.
-
-
-
-
-
-
-
Selected Press (By)
-
-
The Great Student Migration17
-
The New York Times
-
N/A
-
2016
-
-
Most shared and discussed article from the New York Times for August 2016.
-
-
-
-
Wildfires are Getting Worse, The New York Times18
-
The New York Times
-
N/A
-
2016
-
-
GIS analysis and modeling of fire patterns and trends
-
Data in collaboration with NASA and USGS
-
-
-
-
Who’s Speaking at the Democratic National Convention?19
-
The New York Times
-
N/A
-
2016
-
-
Data scraped from CSPAN records to figure out who talked and past conventions.
-
-
-
-
Who’s Speaking at the Republican National Convention?20
-
The New York Times
-
N/A
-
2016
-
-
Used same data scraping techniques as Who’s Speaking at the Democratic National Convention?
-
-
-
-
A Trail of Terror in Nice, Block by Block21
-
The New York Times
-
N/A
-
2016
-
-
Led research effort to put together story of 2016 terrorist attack in Nice, France in less than 12 hours.
-
Work won Silver medal at Malofiej 2017, and gold at Society of News and Design.
-
-
-
-
-
Selected Publications, Posters, and Talks
-
-
Building a software package in tandem with machine learning methods research can result in both more rigorous code and more rigorous research
-
ENAR 2020
-
N/A
-
2020
-
-
Invited talk in Human Data Interaction section.
-
How and why building an R package can benefit methodological research
-
-
-
-
Stochastic Block Modeling in R, Statistically rigorous clustering with rigorous code22
-
RStudio::conf 2020
-
N/A
-
2020
-
-
Invited talk about new sbmR package23.
-
Focus on how software development and methodological research can improve both benefit when done in tandem.
-
-
-
-
Charge Reductions Associated with Shortening Time to Recovery in Septic Shock24
-
Chest
-
N/A
-
2019
-
-
Authored with Wesley H. Self, MD MPH; Dandan Liu, PhD; Stephan Russ, MD, MPH; Michael J. Ward, MD, PhD, MBA; Nathan I. Shapiro, MD, MPH; Todd W. Rice, MD, MSc; Matthew W. Semler, MD, MSc.
-
-
-
-
Multimorbidity Explorer | A shiny app for exploring EHR and biobank data25
-
RStudio::conf 2019
-
N/A
-
2019
-
-
Contributed Poster. Authored with Yaomin Xu.
-
-
-
-
Taking a network view of EHR and Biobank data to find explainable multivariate patterns26
-
Vanderbilt Biostatistics Seminar Series
-
N/A
-
2019
-
-
University wide seminar series.
-
-
-
-
Patient-specific risk factors independently influence survival in Myelodysplastic Syndromes in an unbiased review of EHR records
-
Under-Review (copy available upon request.)
-
N/A
-
2019
-
-
Bayesian network analysis used to find novel subgroups of patients with Myelodysplastic Syndromes (MDS).
-
Analysis done using method built for my dissertation.
-
-
-
-
Patient specific comorbidities impact overall survival in myelofibrosis
-
Under-Review (copy available upon request.)
-
N/A
-
2019
-
-
Bayesian network analysis used to find robust novel subgroups of patients with given genetic mutations.
-
Analysis done using method built for my dissertation.
-
-
-
-
R timelineViz: Visualizing the distribution of study events in longitudinal studies
-
Under-Review (copy available upon request.)
-
N/A
-
2018
-
-
Authored with Alex Sunderman of the Vanderbilt Department of Epidemiology.
-
-
-
-
Continuous Classification using Deep Neural Networks27
-
Vanderbilt Biostatistics Qualification Exam
-
N/A
-
2017
-
-
Review of methods for classifying continuous data streams using neural networks
-
Successfully met qualifying examination standards
-
-
-
-
Asymmetric Linkage Disequilibrium: Tools for Dissecting Multiallelic LD
-
Journal of Human Immunology
-
N/A
-
2015
-
-
Authored with Richard Single, Vanja Paunic, Mark Albrecht, and Martin Maiers.
-
-
-
-
An Agent Based Model of Mysis Migration28
-
International Association of Great Lakes Research Conference
-
N/A
-
2015
-
-
Authored with Brian O’Malley, Sture Hansson, and Jason Stockwell.