{"id":17801380,"url":"https://github.com/evamaerey/ggtedious","last_synced_at":"2026-01-16T00:56:19.527Z","repository":{"id":193109203,"uuid":"683159151","full_name":"EvaMaeRey/ggtedious","owner":"EvaMaeRey","description":"a demo package for messages, warnings, errors and test in ggplot2 extension \"Testing your code can be painful and tedious, but it greatly increases the quality of your code.\"","archived":false,"fork":false,"pushed_at":"2024-03-22T18:22:40.000Z","size":623,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-07T19:20:02.272Z","etag":null,"topics":["extensions","ggplot2","packages","tests","warnings"],"latest_commit_sha":null,"homepage":"https://evamaerey.github.io/ggtedious","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EvaMaeRey.png","metadata":{"files":{"readme":"README.Rmd","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-25T18:32:10.000Z","updated_at":"2024-04-03T19:19:49.000Z","dependencies_parsed_at":"2023-09-06T20:55:24.936Z","dependency_job_id":"b7fa89d9-6e83-4368-b7cc-63a0933b5b9b","html_url":"https://github.com/EvaMaeRey/ggtedious","commit_stats":null,"previous_names":["evamaerey/ggtedious"],"tags_count":0,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EvaMaeRey%2Fggtedious","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EvaMaeRey%2Fggtedious/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EvaMaeRey%2Fggtedious/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EvaMaeRey%2Fggtedious/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EvaMaeRey","download_url":"https://codeload.github.com/EvaMaeRey/ggtedious/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246758278,"owners_count":20828919,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["extensions","ggplot2","packages","tests","warnings"],"created_at":"2024-10-27T12:37:50.896Z","updated_at":"2026-01-16T00:56:19.521Z","avatar_url":"https://github.com/EvaMaeRey.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"---\noutput: \n  github_document:\n    toc: TRUE\n---\n\n\u003c!-- README.md is generated from README.Rmd. Please edit that file --\u003e\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#\u003e\"\n)\n```\n\n# Welcome to the ggtedious workshop!\n\n\u003c!-- badges: start --\u003e\n\u003c!-- badges: end --\u003e\n\nLet's build a cool ggplot2 extension function.  And then let's put it in a package. And test!  Maybe it will be tedious, but more fun in good company?\n\n\u003e 'Testing your code can be painful and tedious, but it greatly increases the quality of your code.'  - testthat introduction (probably Hadley Wickham)\n\nIn this workshop, we'll build and strengthen package building and test writing muscles. \n\n\n\u003c!-- 'Error messages are a huge part of your user interface.  I mean you'd like to think they aren't, but they they are. - https://youtu.be/5LktoXh7WvY?si=bIYS6NLYrGey8o_7\u0026t=2248 --\u003e\n\n\u003c!-- Building a simple, straightforward extension in good company (workshop!) will provide a misery-loves-company occasion to build a correct package and build/strengthen testing muscles.  --\u003e\n\nhttps://angeladuckworth.com/grit-scale/\n\nMeeting objectives:\n\n\u003c!-- 0. My pre-step: Figure out what best practices for ggplot2 extension packages and testing are; and/or figure out some experts to ask for help. --\u003e\n\n1. Practice a `compute_group` easy geom extension by creating geom_post().\n2. Put them in a package using best practices.\n3. Meet like-minded stats educators, ggplot2 extenders, and package developers. \n\nPrerequisite:\n\nHaving written a 'compute group' geom extension.  See:\nhttps://evamaerey.github.io/mytidytuesday/2022-01-03-easy-geom-recipes/easy_geom_recipes.html  Seasoned R/ggplot2 users mostly spent ~ 15 minutes on each recipe.\n\n\n# Part 1. Work on functionality\n\n## Step 0. Do it with base ggplot2 *can become problem statement later*\n\n```{r use_base_ggplot2}\nprize_wheel \u003c- data.frame(probs = c(.7, .2, .1), payout = c(0, 1, 5))\n\nlibrary(ggplot2)\nggplot(prize_wheel) + \n  aes(x = payout, y = probs) + \n  geom_point() + \n  aes(xend = payout, yend = 0) + \n  geom_segment()\n\n```\n\n## Step 0.b Write like-to-have code *code chunk option eval = F*\n\n```{r, eval = F}\n# would show just line\nggplot(prize_wheel) + \n  aes(x = payout, y = probs) + \n  geom_post()\n\n# line and dot\nggplot(prize_wheel) + \n  aes(x = payout, y = probs) + \n  geom_point() + \n  geom_lollipop()\n```\n\n\n## Step 1. Write compute group function and test\n\nreference: https://evamaerey.github.io/mytidytuesday/2022-01-03-easy-geom-recipes/easy_geom_recipes.html\n\n```{r compute_group_post}\n\n```\n\n\n\n```{r try_compute_group_post}\n\n\n```\n\n## Step 2. Pass to ggproto object\n\n```{r ggproto}\n\n\n```\n\n## Step 3. Write geom_post() functions\n\n```{r geom_post}\n\n\n```\n\n## Step 3.1 Bonus, write geom_lollipop with list mechanism\n\n```{r geom_lollipop}\ngeom_lollipop \u003c- function(...){\n\n  list(  \n  geom_post(...),\n  geom_point(...)\n  )\n  \n}\n\n\n```\n\n## Step 4. Test it out enjoy! (possibly basis of examples and tests)\n\n```{r}\n\n\n```\n\n## Step 5. Write messages/warnings etc in the function\n\n# Part II. Packaging and documentation  🚧 ✅\n\n## Phase 1. Minimal working package\n\n### Bit A. Created package archetecture, running `devtools::create(\".\")` in interactive session. 🚧 ✅\n\n\n```{r, eval = F}\ndevtools::create(\".\")\n```\n\n### Bit B. Added roxygen skeleton? 🚧 ✅\n\nUse a roxygen skeleton for auto documentation and making sure proposed functions are *exported*.  Generally, early on, I don't do much (anything) in terms of filling in the skeleton for documentation, because things may change.\n\n### Bit C. Managed dependencies ? 🚧 ✅\n\nPackage dependencies managed, i.e. `depend::function()` in proposed functions and declared in the DESCRIPTION\n\n```{r, eval = F}\nusethis::use_package(\"ggplot2\")\n```\n\n\n### Bit D. Moved functions R folder? 🚧 ✅\n\nUse new {readme2pkg} function to do this from readme...\n\n```{r, eval = F}\nlibrary(tidyverse)\nreadme2pkg::chunk_to_r(\"geom_post\")\n```\n\n### Bit E. Run `devtools::check()` and addressed errors. 🚧 ✅\n\n```{r, eval = F}\ndevtools::check(pkg = \".\")\n```\n\n### Bit F. Build package 🚧 ✅\n\n```{r, eval = F}\ndevtools::build()\n```\n\n\n### Bit G. Write traditional README that uses built package (also serves as a test of build. 🚧 ✅\n\nThe goal of the {ggtedious} package is to make it easy to draw posts (and to learn about package building and testing)\n\nInstall package with:\n\n```\nremotes::install_github(\"EvaMaeRey/ggtedious\")\n```\n\nOnce functions are exported you can remove go to two colons, and when things are are really finalized, then go without colons (and rearrange your readme...)\n\n```{r, eval = F}\nlibrary(ggtedious)  \n\n\n```\n\n\n\n\n### Bit H. Chosen a license? 🚧 ✅\n\n\n```{r, eval = F}\nusethis::use_mit_license()\n```\n\n### Bit I. Add lifecycle badge (experimental) 🚧 ✅\n\n```{r, eval = F}\nusethis::use_lifecycle_badge(\"experimental\")\n```\n\n\n## Phase 2: Listen \u0026 iterate 🚧 ✅\n\nTry to get feedback from experts on API, implementation, default decisions.  Is there already work that solves this problem? \n\n\n## Phase 3: Let things settle\n\n### Bit A. Settle on examples.  Put them in the roxygen skeleton and readme. 🚧 ✅\n\n### Bit B. Written formal tests of functions and save to test that folders 🚧 ✅\n\n\nThat would look like this...\n\n```{r test_calc_times_two_works, eval = F}\nlibrary(testthat)\n\ntest_that(\"calc times 2 works\", {\n  expect_equal(times_two(4), 8)\n  expect_equal(times_two(5), 10)\n  \n})\n```\n\n\n```{r, eval = F}\nreadme2pkg::chunk_to_tests_testthat(\"test_calc_times_two_works\")\n```\n\n\n### Bit C. Added a description and author information in the DESCRIPTION file 🚧 ✅\n\n### Bit D. Addressed *all* notes, warnings and errors. 🚧 \n\n## Phase 4. Promote to wider audience...\n\n### Bit A. Package website built?  ✅\n\n```{r, eval = F}\nusethis::use_pkgdown()\npkgdown::build_site()\n```\n\n\n### Bit B. Package website deployed? 🚧 ✅\n\n## Phase 5: Harden/commit\n\n### Submit to CRAN/RUniverse? 🚧 \n\n# Appendix: Reports, Environment\n\n## Edited Description file?\n\n```{r, eval = F}\nreadLines(\"DESCRIPTION\")\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevamaerey%2Fggtedious","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fevamaerey%2Fggtedious","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevamaerey%2Fggtedious/lists"}