This repository has been archived by the owner on Dec 30, 2023. It is now read-only.
forked from IndrajeetPatil/awesome-r-pkgtools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
854 lines (828 loc) · 55.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
<meta charset="utf-8">
<meta name="generator" content="quarto-1.3.34">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<meta name="author" content="Indrajeet Patil">
<meta name="keywords" content="r packages, software development, software engineering, r">
<title>Awesome R Package Development Tools</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
ul.task-list li input[type="checkbox"] {
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
</style>
<script src="README_files/libs/clipboard/clipboard.min.js"></script>
<script src="README_files/libs/quarto-html/quarto.js"></script>
<script src="README_files/libs/quarto-html/popper.min.js"></script>
<script src="README_files/libs/quarto-html/tippy.umd.min.js"></script>
<script src="README_files/libs/quarto-html/anchor.min.js"></script>
<link href="README_files/libs/quarto-html/tippy.css" rel="stylesheet">
<link href="README_files/libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
<script src="README_files/libs/bootstrap/bootstrap.min.js"></script>
<link href="README_files/libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
<link href="README_files/libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">
</head>
<body>
<div id="quarto-content" class="page-columns page-rows-contents page-layout-article">
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
<nav id="TOC" role="doc-toc" class="toc-active">
<h2 id="toc-title">Table of contents</h2>
<ul>
<li><a href="#contributing" id="toc-contributing" class="nav-link active" data-scroll-target="#contributing">Contributing</a></li>
<li><a href="#swiss-army-knives" id="toc-swiss-army-knives" class="nav-link" data-scroll-target="#swiss-army-knives">Swiss army knives 🛠</a></li>
<li><a href="#package-templates" id="toc-package-templates" class="nav-link" data-scroll-target="#package-templates">Package templates 💀</a>
<ul class="collapse">
<li><a href="#generic" id="toc-generic" class="nav-link" data-scroll-target="#generic">Generic</a></li>
<li><a href="#rmarkdown-based" id="toc-rmarkdown-based" class="nav-link" data-scroll-target="#rmarkdown-based">RMarkdown-based</a></li>
<li><a href="#shiny" id="toc-shiny" class="nav-link" data-scroll-target="#shiny">Shiny</a></li>
<li><a href="#meta-packages" id="toc-meta-packages" class="nav-link" data-scroll-target="#meta-packages">Meta-packages</a></li>
</ul></li>
<li><a href="#naming-things" id="toc-naming-things" class="nav-link" data-scroll-target="#naming-things">Naming things 🧸</a></li>
<li><a href="#working-with-package-components" id="toc-working-with-package-components" class="nav-link" data-scroll-target="#working-with-package-components">Working with package components</a></li>
<li><a href="#package-configuration" id="toc-package-configuration" class="nav-link" data-scroll-target="#package-configuration">Package configuration</a></li>
<li><a href="#package-management-tools" id="toc-package-management-tools" class="nav-link" data-scroll-target="#package-management-tools">Package management tools</a></li>
<li><a href="#documentation" id="toc-documentation" class="nav-link" data-scroll-target="#documentation">Documentation 📚</a>
<ul class="collapse">
<li><a href="#manual" id="toc-manual" class="nav-link" data-scroll-target="#manual">Manual</a></li>
<li><a href="#math-rendering-in-the-manual" id="toc-math-rendering-in-the-manual" class="nav-link" data-scroll-target="#math-rendering-in-the-manual">Math rendering in the manual</a></li>
<li><a href="#vignettes" id="toc-vignettes" class="nav-link" data-scroll-target="#vignettes">Vignettes</a></li>
<li><a href="#website" id="toc-website" class="nav-link" data-scroll-target="#website">Website</a></li>
<li><a href="#translation" id="toc-translation" class="nav-link" data-scroll-target="#translation">Translation</a></li>
<li><a href="#lifecycle" id="toc-lifecycle" class="nav-link" data-scroll-target="#lifecycle">Lifecycle</a></li>
<li><a href="#badges-and-stickers" id="toc-badges-and-stickers" class="nav-link" data-scroll-target="#badges-and-stickers">Badges and stickers</a></li>
<li><a href="#presentation" id="toc-presentation" class="nav-link" data-scroll-target="#presentation">Presentation</a></li>
<li><a href="#book" id="toc-book" class="nav-link" data-scroll-target="#book">Book</a></li>
<li><a href="#change-log-and-versioning" id="toc-change-log-and-versioning" class="nav-link" data-scroll-target="#change-log-and-versioning">Change log and versioning</a></li>
</ul></li>
<li><a href="#documentation-quality" id="toc-documentation-quality" class="nav-link" data-scroll-target="#documentation-quality">Documentation quality ✒️</a></li>
<li><a href="#unit-testing" id="toc-unit-testing" class="nav-link" data-scroll-target="#unit-testing">Unit testing 🧪</a>
<ul class="collapse">
<li><a href="#general" id="toc-general" class="nav-link" data-scroll-target="#general">General</a></li>
<li><a href="#markdown-documents" id="toc-markdown-documents" class="nav-link" data-scroll-target="#markdown-documents">Markdown documents</a></li>
<li><a href="#shiny-applications" id="toc-shiny-applications" class="nav-link" data-scroll-target="#shiny-applications">Shiny applications</a></li>
<li><a href="#webdatabase-applications" id="toc-webdatabase-applications" class="nav-link" data-scroll-target="#webdatabase-applications">Web/database applications</a></li>
<li><a href="#visual-regression-testing" id="toc-visual-regression-testing" class="nav-link" data-scroll-target="#visual-regression-testing">Visual regression testing</a></li>
<li><a href="#mock-testing" id="toc-mock-testing" class="nav-link" data-scroll-target="#mock-testing">Mock testing</a></li>
<li><a href="#helpers-for-testing-frameworks" id="toc-helpers-for-testing-frameworks" class="nav-link" data-scroll-target="#helpers-for-testing-frameworks">Helpers for testing frameworks</a></li>
</ul></li>
<li><a href="#codedocument-formatting" id="toc-codedocument-formatting" class="nav-link" data-scroll-target="#codedocument-formatting">Code/Document Formatting 🧽</a></li>
<li><a href="#code-analysis" id="toc-code-analysis" class="nav-link" data-scroll-target="#code-analysis">Code analysis 🗂⏱</a>
<ul class="collapse">
<li><a href="#general-1" id="toc-general-1" class="nav-link" data-scroll-target="#general-1">General</a></li>
<li><a href="#code-coverage" id="toc-code-coverage" class="nav-link" data-scroll-target="#code-coverage">Code coverage</a></li>
<li><a href="#lint-detection" id="toc-lint-detection" class="nav-link" data-scroll-target="#lint-detection">Lint detection</a></li>
<li><a href="#code-complexity" id="toc-code-complexity" class="nav-link" data-scroll-target="#code-complexity">Code complexity</a></li>
<li><a href="#code-similarity" id="toc-code-similarity" class="nav-link" data-scroll-target="#code-similarity">Code similarity</a></li>
<li><a href="#compiled-code" id="toc-compiled-code" class="nav-link" data-scroll-target="#compiled-code">Compiled code</a></li>
<li><a href="#javascript-code" id="toc-javascript-code" class="nav-link" data-scroll-target="#javascript-code">JavaScript code</a></li>
<li><a href="#lines-of-code" id="toc-lines-of-code" class="nav-link" data-scroll-target="#lines-of-code">Lines of code</a></li>
</ul></li>
<li><a href="#refactoring" id="toc-refactoring" class="nav-link" data-scroll-target="#refactoring">Refactoring</a></li>
<li><a href="#code-performance" id="toc-code-performance" class="nav-link" data-scroll-target="#code-performance">Code performance ⏱️</a>
<ul class="collapse">
<li><a href="#benchmarking" id="toc-benchmarking" class="nav-link" data-scroll-target="#benchmarking">Benchmarking</a></li>
<li><a href="#profiling" id="toc-profiling" class="nav-link" data-scroll-target="#profiling">Profiling</a></li>
</ul></li>
<li><a href="#dependencies" id="toc-dependencies" class="nav-link" data-scroll-target="#dependencies">Dependencies ⚖️</a></li>
<li><a href="#cranbioconductor-checks-submission-and-status" id="toc-cranbioconductor-checks-submission-and-status" class="nav-link" data-scroll-target="#cranbioconductor-checks-submission-and-status">CRAN/Bioconductor checks, submission, and status 📬</a></li>
<li><a href="#usage" id="toc-usage" class="nav-link" data-scroll-target="#usage">Usage 🙈</a></li>
<li><a href="#cicd" id="toc-cicd" class="nav-link" data-scroll-target="#cicd">CI/CD 📟</a></li>
<li><a href="#securityprivacy" id="toc-securityprivacy" class="nav-link" data-scroll-target="#securityprivacy">Security/Privacy 👮</a></li>
<li><a href="#build-systems" id="toc-build-systems" class="nav-link" data-scroll-target="#build-systems">Build systems</a></li>
<li><a href="#validation-frameworks" id="toc-validation-frameworks" class="nav-link" data-scroll-target="#validation-frameworks">Validation frameworks</a></li>
<li><a href="#debugging" id="toc-debugging" class="nav-link" data-scroll-target="#debugging">Debugging 🔭</a></li>
<li><a href="#input-validation" id="toc-input-validation" class="nav-link" data-scroll-target="#input-validation">Input validation 🔬</a></li>
<li><a href="#package-metadata" id="toc-package-metadata" class="nav-link" data-scroll-target="#package-metadata">Package metadata 🖨</a></li>
<li><a href="#reverse-dependency-checks" id="toc-reverse-dependency-checks" class="nav-link" data-scroll-target="#reverse-dependency-checks">Reverse dependency checks 📡⚰️</a></li>
<li><a href="#gratitude" id="toc-gratitude" class="nav-link" data-scroll-target="#gratitude">Gratitude 🙏💌</a></li>
<li><a href="#docker-container" id="toc-docker-container" class="nav-link" data-scroll-target="#docker-container">Docker container 🛍</a></li>
<li><a href="#integration-with-other-languages" id="toc-integration-with-other-languages" class="nav-link" data-scroll-target="#integration-with-other-languages">Integration with other languages 🔗</a>
<ul class="collapse">
<li><a href="#c" id="toc-c" class="nav-link" data-scroll-target="#c">C++</a></li>
<li><a href="#fortran" id="toc-fortran" class="nav-link" data-scroll-target="#fortran">Fortran</a></li>
<li><a href="#python" id="toc-python" class="nav-link" data-scroll-target="#python">Python</a></li>
<li><a href="#rust" id="toc-rust" class="nav-link" data-scroll-target="#rust">Rust</a></li>
<li><a href="#net-framework" id="toc-net-framework" class="nav-link" data-scroll-target="#net-framework">.NET Framework</a></li>
<li><a href="#javascripthtmlcss" id="toc-javascripthtmlcss" class="nav-link" data-scroll-target="#javascripthtmlcss">JavaScript/HTML/CSS</a></li>
<li><a href="#julia" id="toc-julia" class="nav-link" data-scroll-target="#julia">Julia</a></li>
</ul></li>
<li><a href="#upkeep" id="toc-upkeep" class="nav-link" data-scroll-target="#upkeep">Upkeep 🧹</a></li>
<li><a href="#sundry" id="toc-sundry" class="nav-link" data-scroll-target="#sundry">Sundry 🗒</a></li>
</ul>
<div class="quarto-alternate-formats"><h2>Other Formats</h2><ul><li><a href="README.md"><i class="bi bi-file-code"></i>Github (GFM)</a></li></ul></div></nav>
</div>
<main class="content" id="quarto-document-content">
<header id="title-block-header" class="quarto-title-block default">
<div class="quarto-title">
<h1 class="title">Awesome R Package Development Tools</h1>
</div>
<div class="quarto-title-meta">
<div>
<div class="quarto-title-meta-heading">Author</div>
<div class="quarto-title-meta-contents">
<p>Indrajeet Patil </p>
</div>
</div>
<div>
<div class="quarto-title-meta-heading">Modified</div>
<div class="quarto-title-meta-contents">
<p class="date-modified">November 30, 2022</p>
</div>
</div>
</div>
</header>
<p>A curated list of awesome tools to assist 📦 development in R programming language.</p>
<p><a href="https://awesome.re/"><img src="https://awesome.re/badge.svg" class="img-fluid" alt="Awesome"></a> <a href="https://www.trackawesomelist.com/"><img src="https://www.trackawesomelist.com/badge.svg" class="img-fluid" alt="Track Awesome List"></a></p>
<!-- TODO: https://www.trackawesomelist.com/IndrajeetPatil/awesome-r-pkgtools/ -->
<!-- Don't render this file manually. Run `renderer.R` script locally instead. -->
<div class="callout-tip callout callout-style-default callout-captioned">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-caption-container flex-fill">
What is included?
</div>
</div>
<div class="callout-body-container callout-body">
<ul>
<li>Only <em>tools</em> helpful for package development are included, and not other resources (e.g. books).</li>
<li>All relevant tools are included, irrespective of their availability on <a href="https://cran.r-project.org/">CRAN</a>/<a href="https://www.bioconductor.org/">Bioconductor</a>.</li>
<li>Tools which are part of publicly archived/retired GitHub repositories are <em>not</em> included.</li>
</ul>
</div>
</div>
<p>If you wish to suggest any additional tools, please make a PR or create an issue <a href="https://github.com/IndrajeetPatil/awesome-r-pkgtools/">here</a>.</p>
<section id="contributing" class="level1">
<h1>Contributing</h1>
<p>Please note that the <code>awesome-r-pkgtools</code> project is released with a <a href="https://contributor-covenant.org/version/2/1/CODE_OF_CONDUCT.html">Contributor Code of Conduct</a>. By contributing to this project, you agree to abide by its terms.</p>
</section>
<section id="swiss-army-knives" class="level1">
<h1>Swiss army knives 🛠</h1>
<p>Tools useful across all stages of package development (some of these are meta-packages and their component packages are also included in respective sections for the sake of completeness), irrespective of whether package is meant to be submitted to CRAN or to Bioconductor.</p>
<ul>
<li><p><a href="https://devtools.r-lib.org"><code>{devtools}</code></a></p></li>
<li><p><a href="https://usethis.r-lib.org"><code>{usethis}</code></a></p></li>
<li><p><a href="https://lcolladotor.github.io/biocthis/"><code>{biocthis}</code></a></p></li>
<li><p><a href="https://cran.r-project.org/package=packager"><code>{packager}</code></a></p></li>
<li><p><a href="https://polkas.github.io/pacs/"><code>{pacs}</code></a></p></li>
</ul>
</section>
<section id="package-templates" class="level1">
<h1>Package templates 💀</h1>
<section id="generic" class="level2">
<h2 class="anchored" data-anchor-id="generic">Generic</h2>
<ul>
<li><p><a href="https://dirk.eddelbuettel.com/code/pkgkitten.html"><code>{pkgkitten}</code></a> (useful for creating new packages for R)</p></li>
<li><p><a href="https://frbcesab.github.io/rcompendium/"><code>{rcompendium}</code></a> (to make the creation of R package/research compendium easier)</p></li>
<li><p><a href="https://github.com/nealrichardson/skeletor/"><code>{skeletor}</code></a> (An R Package Skeleton Generator)</p></li>
</ul>
</section>
<section id="rmarkdown-based" class="level2">
<h2 class="anchored" data-anchor-id="rmarkdown-based">RMarkdown-based</h2>
<ul>
<li><p><a href="https://thinkr-open.github.io/fusen/"><code>{fusen}</code></a> (to build a package from RMarkdown files)</p></li>
<li><p><a href="http://faculty.marshall.usc.edu/jacob-bien/litr/docs/"><code>{litr}</code></a> (to write a complete R package in a single R markdown document)</p></li>
</ul>
</section>
<section id="shiny" class="level2">
<h2 class="anchored" data-anchor-id="shiny">Shiny</h2>
<ul>
<li><p><a href="https://github.com/ThinkR-open/golem/"><code>{golem}</code></a> (framework for building shiny applications)</p></li>
<li><p><a href="https://leprechaun.opifex.org/#/"><code>{leprechaun}</code></a> (leaner framework for building shiny applications)</p></li>
<li><p><a href="https://appsilon.github.io/rhino/"><code>{rhino}</code></a> (a framework to build high quality, enterprise-grade Shiny apps at speed)</p></li>
</ul>
</section>
<section id="meta-packages" class="level2">
<h2 class="anchored" data-anchor-id="meta-packages">Meta-packages</h2>
<ul>
<li><p><a href="https://pkgverse.mikewk.com"><code>{pkgverse}</code></a> (for package meta-verse)</p></li>
<li><p><a href="https://github.com/jdtrat/metamakr/"><code>{metamakr}</code></a> (for package meta-verse)</p></li>
</ul>
</section>
</section>
<section id="naming-things" class="level1">
<h1>Naming things 🧸</h1>
<ul>
<li><p><a href="https://cran.r-project.org/package=available"><code>{available}</code></a> (to check if a package name is available to use)</p></li>
<li><p><a href="https://cran.r-project.org/package=collidr"><code>{collidr}</code></a> (to check for namespace collisions)</p></li>
<li><p><a href="https://cran.r-project.org/package=changer"><code>{changer}</code></a> (to change the name of an existing R package)</p></li>
</ul>
</section>
<section id="working-with-package-components" class="level1">
<h1>Working with package components</h1>
<ul>
<li><p><a href="https://rprojroot.r-lib.org"><code>{rprojroot}</code></a> (accessing files w.r.t. package root directory)</p></li>
<li><p><a href="https://github.com/r-lib/desc#readme"><code>{desc}</code></a> (manipulating <code>DESCRIPTION</code> files)</p></li>
<li><p><a href="https://withr.r-lib.org"><code>{withr}</code></a> (to manage package side effects by safely and temporarily modifying global states)</p></li>
<li><p><a href="https://pkgload.r-lib.org/"><code>{pkgload}</code></a> (to simulate the process of installing and loading a package)</p></li>
<li><p><a href="https://cran.r-project.org/package=pkgbuild"><code>{pkgbuild}</code></a> (to find tools needed to build packages)</p></li>
</ul>
</section>
<section id="package-configuration" class="level1">
<h1>Package configuration</h1>
<ul>
<li><a href="https://rstudio.github.io/config/"><code>{config}</code></a> (to manage environment specific configuration values)</li>
</ul>
</section>
<section id="package-management-tools" class="level1">
<h1>Package management tools</h1>
<ul>
<li><a href="https://cran.r-project.org/package=pkgcache"><code>{pkgcache}</code></a> (to cache ‘CRAN’-like metadata and packages)</li>
</ul>
</section>
<section id="documentation" class="level1">
<h1>Documentation 📚</h1>
<section id="manual" class="level2">
<h2 class="anchored" data-anchor-id="manual">Manual</h2>
<ul>
<li><p><a href="https://roxygen2.r-lib.org"><code>{roxygen2}</code></a> (to generate R package documentation from inline R comments)</p></li>
<li><p><a href="https://cran.r-project.org/package=Rd2roxygen"><code>{Rd2roxygen}</code></a> (in case you inherit a project where documentation was not written using <code>{roxygen2}</code>)</p></li>
<li><p><a href="https://yonicd.github.io/sinew/"><code>{sinew}</code></a> (generate <code>{roxygen2}</code> skeletons)</p></li>
<li><p><a href="https://cran.r-project.org/package=roclang"><code>{roclang}</code></a> (helpers for diffusing content across function documentation)</p></li>
<li><p><a href="https://cran.r-project.org/package=Rdpack"><code>{Rdpack}</code></a> (for inserting references, figures, and evaluated examples in Rd docs)</p></li>
<li><p><a href="https://roxygen2md.r-lib.org"><code>{roxygen2md}</code></a> (to allow Markdown syntax usage in <code>{roxygen2}</code> documentation)</p></li>
<li><p><a href="https://github.com/Genentech/rd2markdown"><code>{rd2markdown}</code></a> (to convert <code>.Rd</code> package documentation files into markdown files)</p></li>
<li><p><a href="https://github.com/coolbutuseless/rd2list"><code>{rd2list}</code></a> (converts Rd docs to a human-readable list)</p></li>
<li><p><a href="https://cran.r-project.org/package=pasteAsComment"><code>{pasteAsComment}</code></a> (RStudio addin for pasting copied code as roxygen comment)</p></li>
<li><p><a href="https://github.com/csgillespie/roxygen2Comment"><code>roxygen2Comment</code></a> (Rstudio addin for adding and remove <code>{roxygen2}</code> comment)</p></li>
</ul>
</section>
<section id="math-rendering-in-the-manual" class="level2">
<h2 class="anchored" data-anchor-id="math-rendering-in-the-manual">Math rendering in the manual</h2>
<ul>
<li><p><a href="https://docs.ropensci.org/katex/"><code>{katex}</code></a> (to convert latex math expressions to HTML for use in package manual pages)</p></li>
<li><p><a href="https://cran.r-project.org/package=mathjaxr"><code>{mathjaxr}</code></a> (provides ‘MathJax’ and macros to enable its use within <code>Rd</code> files for rendering equations in the HTML help files)</p></li>
</ul>
</section>
<section id="vignettes" class="level2">
<h2 class="anchored" data-anchor-id="vignettes">Vignettes</h2>
<ul>
<li><p><a href="https://yihui.org/knitr"><code>{knitr}</code></a> (a general-purpose tool for dynamic report generation to be used as a vignette builder for R package vignettes)</p></li>
<li><p><a href="https://rmarkdown.rstudio.com"><code>{rmarkdown}</code></a> (to convert R Markdown documents to a variety of formats)</p></li>
<li><p><a href="https://quarto-dev.github.io/quarto-r/"><code>{quarto}</code></a> (provides R interface to frequently used operations in the Quarto CLI)</p></li>
<li><p><a href="https://CRAN.R-project.org/package=prettydoc"><code>{prettydoc}</code></a> (creates lightweight yet pretty vignettes)</p></li>
<li><p><a href="https://rstudio.github.io/learnr/"><code>{learnr}</code></a> (to turn any R Markdown document into an interactive tutorial)</p></li>
</ul>
</section>
<section id="website" class="level2">
<h2 class="anchored" data-anchor-id="website">Website</h2>
<ul>
<li><p><a href="https://pkgdown.r-lib.org"><code>{pkgdown}</code></a> (static website for package documentation)</p></li>
<li><p><a href="https://github.com/ThinkR-open/gitdown/"><code>{gitdown}</code></a> (software changes as a gitbook)</p></li>
<li><p><a href="https://altdoc.etiennebacher.com"><code>{altdoc}</code></a> (use <a href="https://docute.org/">docute</a> or <a href="https://docsify.js.org/">docsify</a> to create a static website for package documentation)</p></li>
</ul>
</section>
<section id="translation" class="level2">
<h2 class="anchored" data-anchor-id="translation">Translation</h2>
<ul>
<li><a href="https://github.com/MichaelChirico/potools/"><code>{potools}</code></a> (for translating messages and checking the “health” of the messaging corpus)</li>
</ul>
</section>
<section id="lifecycle" class="level2">
<h2 class="anchored" data-anchor-id="lifecycle">Lifecycle</h2>
<ul>
<li><a href="https://lifecycle.r-lib.org"><code>{lifecycle}</code></a> (to manage the life cycle of exported functions)</li>
</ul>
</section>
<section id="badges-and-stickers" class="level2">
<h2 class="anchored" data-anchor-id="badges-and-stickers">Badges and stickers</h2>
<ul>
<li><p><a href="https://cran.r-project.org/package=badger"><code>{badger}</code></a> (query information and generate badges for using in <code>README</code> and <code>GitHub Pages</code>)</p></li>
<li><p><a href="https://cran.r-project.org/package=hexSticker"><code>{hexSticker}</code></a> (helper functions for creating reproducible hexagon sticker purely in R)</p></li>
<li><p><a href="https://github.com/mitchelloharawild/hexwall/"><code>hexwall</code></a> (to create a wall of hexstickers)</p></li>
</ul>
</section>
<section id="presentation" class="level2">
<h2 class="anchored" data-anchor-id="presentation">Presentation</h2>
<ul>
<li><a href="https://github.com/yihui/xaringan/"><code>{xaringan}</code></a> (an RMarkdown output format for <code>remark.js</code> slides)</li>
</ul>
</section>
<section id="book" class="level2">
<h2 class="anchored" data-anchor-id="book">Book</h2>
<ul>
<li><a href="https://pkgs.rstudio.com/bookdown/"><code>{bookdown}</code></a> (authoring framework for books and technical documents with R Markdown)</li>
</ul>
</section>
<section id="change-log-and-versioning" class="level2">
<h2 class="anchored" data-anchor-id="change-log-and-versioning">Change log and versioning</h2>
<ul>
<li><p><a href="https://fledge.cynkra.com/"><code>{fledge}</code></a> (to streamline the process of updating change logs and versioning R packages developed in git repositories)</p></li>
<li><p><a href="https://cran.r-project.org/package=newsmd"><code>{newsmd}</code></a> (utilities to add updates to the <code>NEWS.md</code> file)</p></li>
<li><p><a href="https://cran.r-project.org/package=autonewsmd"><code>{autonewsmd}</code></a> (to auto-generate change log using conventional commits)</p></li>
</ul>
</section>
</section>
<section id="documentation-quality" class="level1">
<h1>Documentation quality ✒️</h1>
<ul>
<li><p><a href="https://thisisnic.github.io/docreview/"><code>{docreview}</code></a> (to check quality of docs)</p></li>
<li><p><a href="https://docs.ropensci.org/spelling/"><code>{spelling}</code></a> (to check for spelling mistakes)</p></li>
<li><p><a href="https://github.com/jasdumas/gramr/"><code>{gramr}</code></a> (for grammar suggestions)</p></li>
</ul>
</section>
<section id="unit-testing" class="level1">
<h1>Unit testing 🧪</h1>
<section id="general" class="level2">
<h2 class="anchored" data-anchor-id="general">General</h2>
<ul>
<li><p><a href="https://testthat.r-lib.org"><code>{testthat}</code></a> (a testing framework for R that is easy to learn and use; also provides snapshot testing)</p></li>
<li><p><a href="https://cran.r-project.org/package=patrick"><code>{patrick}</code></a> (for parameterized unit testing with <code>{testthat}</code>)</p></li>
<li><p><a href="https://cran.r-project.org/package=tinytest"><code>{tinytest}</code></a> (zero-dependency unit testing framework that installs tests with the package)</p></li>
<li><p><a href="https://cran.r-project.org/package=RUnit"><code>{RUnit}</code></a> (a standard Unit Testing framework, with additional code inspection and report generation tools)</p></li>
<li><p><a href="https://CRAN.R-project.org/package=testit"><code>{testit}</code></a> (a simple package for testing R packages)</p></li>
<li><p><a href="https://CRAN.R-project.org/package=realtest"><code>{realtest}</code></a> (a framework unit testing that distinguishes between expected, acceptable, current, fallback, ideal, or regressive behaviours)</p></li>
<li><p><a href="https://github.com/mikldk/roxytest/"><code>{roxytest}</code></a> (inline <code>{testthat}</code> tests with <code>{roxygen2}</code>)</p></li>
<li><p><a href="https://cran.r-project.org/package=roxut"><code>{roxut}</code></a> (to write the unit tests in the same file as the function)</p></li>
<li><p><a href="https://rorynolan.github.io/exampletestr/"><code>{exampletestr}</code></a> (tests based on package examples)</p></li>
<li><p><a href="https://cran.r-project.org/package=unitizer"><code>{unitizer}</code></a> (simplifies regression tests by comparing objects produced by test code with earlier versions of those same objects)</p></li>
<li><p><a href="https://github.com/hedgehogqa/r-hedgehog"><code>{r-hedgehog}</code></a> (property based testing)</p></li>
<li><p><a href="https://docs.ropensci.org/autotest/"><code>{autotest}</code></a> (automatic mutation testing of R packages)</p></li>
</ul>
</section>
<section id="markdown-documents" class="level2">
<h2 class="anchored" data-anchor-id="markdown-documents">Markdown documents</h2>
<ul>
<li><a href="https://cderv.github.io/pandoc/"><code>{pandoc}</code></a> (to check Markdown documents across various version of <a href="https://pandoc.org">Pandoc</a>)</li>
</ul>
</section>
<section id="shiny-applications" class="level2">
<h2 class="anchored" data-anchor-id="shiny-applications">Shiny applications</h2>
<ul>
<li><p><a href="https://rstudio.github.io/shinytest/"><code>{shinytest}</code></a> (testing Shiny apps)</p></li>
<li><p><a href="https://rstudio.github.io/shinytest2/"><code>{shinytest2}</code></a> (testing Shiny apps using a headless Chromium web browser)</p></li>
<li><p><a href="https://rstudio.github.io/shinyloadtest/"><code>{shinyloadtest}</code></a> (to load test deployed Shiny apps)</p></li>
</ul>
</section>
<section id="webdatabase-applications" class="level2">
<h2 class="anchored" data-anchor-id="webdatabase-applications">Web/database applications</h2>
<ul>
<li><p><a href="https://enpiar.com/r/httptest/"><code>{httptest}</code></a> (a test environment for HTTP requests in R)</p></li>
<li><p><a href="https://enpiar.com/httptest2/"><code>{httptest2}</code></a> (the same for <code>{httr2}</code> package)</p></li>
<li><p><a href="https://webfakes.r-lib.org/"><code>{webfakes}</code></a> (provides fake web apps for HTTP testing R packages)</p></li>
<li><p><a href="https://dittodb.jonkeane.com/"><code>{dittodb}</code></a> (makes testing against databases easy)</p></li>
</ul>
</section>
<section id="visual-regression-testing" class="level2">
<h2 class="anchored" data-anchor-id="visual-regression-testing">Visual regression testing</h2>
<ul>
<li><p><a href="https://vdiffr.r-lib.org"><code>{vdiffr}</code></a> (for visual regression testing with <code>{testthat}</code>)</p></li>
<li><p><a href="https://cran.r-project.org/package=gdiff"><code>{gdiff}</code></a> (for performing graphical difference different package or R versions)</p></li>
</ul>
</section>
<section id="mock-testing" class="level2">
<h2 class="anchored" data-anchor-id="mock-testing">Mock testing</h2>
<ul>
<li><p><a href="https://nbenn.github.io/mockthat/"><code>{mockthat}</code></a> (function mocking for unit testing to third-party packages)</p></li>
<li><p><a href="https://krlmlr.github.io/mockr/"><code>{mockr}</code></a> (allows mocking functions in the package under test)</p></li>
<li><p><a href="https://github.com/ThinkR-open/testdown/"><code>{testdown}</code></a> (turn <code>{testthat}</code> results into a <code>{bookdown}</code> project)</p></li>
</ul>
</section>
<section id="helpers-for-testing-frameworks" class="level2">
<h2 class="anchored" data-anchor-id="helpers-for-testing-frameworks">Helpers for testing frameworks</h2>
<ul>
<li><p><a href="https://cran.r-project.org/package=testthis"><code>{testthis}</code></a> (RStudio addins for working with files that contain tests)</p></li>
<li><p><a href="https://github.com/LudvigOlsen/xpectr/"><code>{xpectr}</code></a> (builds unit tests with the <code>{testthat}</code> package by providing tools for generating expectations)</p></li>
</ul>
</section>
</section>
<section id="codedocument-formatting" class="level1">
<h1>Code/Document Formatting 🧽</h1>
<ul>
<li><p><a href="https://styler.r-lib.org"><code>{styler}</code></a> (to format code according to a style guide)</p></li>
<li><p><a href="https://github.com/lorenzwalthert/stylermd/"><code>{stylermd}</code></a> (to format text in Markdown documents)</p></li>
<li><p><a href="https://yihui.org/formatr"><code>{formatR}</code></a> (to format R source code)</p></li>
<li><p><a href="https://github.com/gadenbuie/grkstyle/"><code>{grkstyle}</code></a> (extension package for <code>{styler}</code> that supports author’s personal code style preferences)</p></li>
<li><p><a href="https://github.com/lionel-/codegrip/"><code>{codegrip}</code></a> (addin for RStudio IDE to reshape R code and navigate across syntactic constructs)</p></li>
<li><p><a href="https://github.com/Bioconductor/BiocStyle/"><code>{BiocStyle}</code></a> (provides standard formatting styles for Bioconductor PDF and HTML documents)</p></li>
<li><p><a href="https://github.com/seasmith/AlignAssign"><code>AlignAssign</code></a> (RStudio addin that aligns the assignment operators within a highlighted area)</p></li>
<li><p><a href="https://tazinho.github.io/snakecase/"><code>{snakecase}</code></a> (helpful for having consistent case while naming objects in the package)</p></li>
<li><p><a href="https://indrajeetpatil.github.io/dotInternals/"><code>{dotInternals}</code></a> (to distinguish non-exported package functions by prepending their names with a dot)</p></li>
</ul>
</section>
<section id="code-analysis" class="level1">
<h1>Code analysis 🗂⏱</h1>
<section id="general-1" class="level2">
<h2 class="anchored" data-anchor-id="general-1">General</h2>
<ul>
<li><p><a href="https://cran.r-project.org/package=codetools"><code>{codetools}</code></a> (code analysis tools for R)</p></li>
<li><p><a href="http://mangothecat.github.io/goodpractice/"><code>{goodpractice}</code></a> (Swiss army knife for good practices)</p></li>
<li><p><a href="https://github.com/jumpingrivers/inteRgrate/"><code>{inteRgrate}</code></a> (provides an opinionated set of rules for R package development)</p></li>
<li><p><a href="https://docs.ropensci.org/pkgcheck/"><code>{pkgcheck}</code></a> (checks if package follows good practices recommended for packages in the <a href="https://ropensci.org/"><code>rOpenSci</code></a> ecosystem)</p></li>
<li><p><a href="https://docs.ropensci.org/pkgstats/">{pkgstats}</a> (a static code analysis tool)</p></li>
<li><p><a href="https://github.com/kalibera/rchk/"><code>{rchk}</code></a> (provides several bug-finding tools that look for memory protection errors in C source code using R API)</p></li>
<li><p><a href="https://cran.r-project.org/package=sourcetools"><code>{sourcetools}</code></a> (tools for reading, tokenizing, and parsing R code)</p></li>
<li><p><a href="https://lorenzwalthert.github.io/precommit/"><code>{precommit}</code></a> (git hooks for common tasks like formatting files, spell checking, etc.)</p></li>
</ul>
</section>
<section id="code-coverage" class="level2">
<h2 class="anchored" data-anchor-id="code-coverage">Code coverage</h2>
<ul>
<li><p><a href="https://covr.r-lib.org"><code>{covr}</code></a> (to compute code coverage)</p></li>
<li><p><a href="https://yonicd.github.io/covrpage/"><code>{covrpage}</code></a> (to include summary <code>README</code> of code coverage and more detailed information about tests)</p></li>
<li><p><a href="https://github.com/Genentech/covtracer/"><code>{covtracer}</code></a> (provides tools for contextualizing tests)</p></li>
</ul>
</section>
<section id="lint-detection" class="level2">
<h2 class="anchored" data-anchor-id="lint-detection">Lint detection</h2>
<ul>
<li><p><a href="https://github.com/r-lib/lintr/"><code>{lintr}</code></a> (static code analysis)</p></li>
<li><p><a href="https://github.com/duncantl/CodeDepends"><code>{CodeDepends}</code></a> (analysis of R code for reproducible research and code view)</p></li>
<li><p><a href="https://cran.r-project.org/package=adaptalint"><code>{adaptalint}</code></a> (infer code style from one package and use it to check another)</p></li>
<li><p><a href="https://cran.r-project.org/package=roger"><code>{roger}</code></a> (provides tools for grading the coding style and documentation of R scripts)</p></li>
<li><p><a href="https://cran.r-project.org/package=cleanr"><code>{cleanr}</code></a> (tests code for some of the most common code layout flaws)</p></li>
</ul>
</section>
<section id="code-complexity" class="level2">
<h2 class="anchored" data-anchor-id="code-complexity">Code complexity</h2>
<ul>
<li><a href="https://cran.r-project.org/package=cyclocomp"><code>{cyclocomp}</code></a> (to index the complexity of a function)</li>
</ul>
</section>
<section id="code-similarity" class="level2">
<h2 class="anchored" data-anchor-id="code-similarity">Code similarity</h2>
<ul>
<li><p><a href="https://github.com/russHyde/dupree/"><code>{dupree}</code></a> (identifies code blocks that have a high level of similarity within a set of R files)</p></li>
<li><p><a href="https://cran.r-project.org/package=rscc"><code>{rscc}</code></a> (provides source code similarity evaluation by variable/function names)</p></li>
<li><p><a href="https://cran.r-project.org/package=SimilaR"><code>{SimilaR}</code></a> (quantifies the similarity of the code-base of R functions by means of program dependence graphs)</p></li>
</ul>
</section>
<section id="compiled-code" class="level2">
<h2 class="anchored" data-anchor-id="compiled-code">Compiled code</h2>
<ul>
<li><p><a href="https://memtools.r-lib.org/"><code>{memtools}</code></a> (to solve memory leaks)</p></li>
<li><p><a href="https://cran.r-project.org/package=cppcheckR"><code>{cppcheckR}</code></a> (to check <code>C</code> and <code>C++</code> code using <a href="https://cppcheck.sourceforge.io/"><code>Cppcheck</code></a>)</p></li>
</ul>
</section>
<section id="javascript-code" class="level2">
<h2 class="anchored" data-anchor-id="javascript-code">JavaScript code</h2>
<ul>
<li><a href="https://cran.r-project.org/package=jshintr"><code>{jshintr}</code></a> (to run <a href="https://jshint.com/about/">JSHint</a> for static code analysis for JavaScript code included in the package)</li>
</ul>
</section>
<section id="lines-of-code" class="level2">
<h2 class="anchored" data-anchor-id="lines-of-code">Lines of code</h2>
<ul>
<li><a href="https://github.com/hrbrmstr/cloc/"><code>{cloc}</code></a> (counts blank lines, comment lines, and physical lines of source code in source files)</li>
</ul>
</section>
</section>
<section id="refactoring" class="level1">
<h1>Refactoring</h1>
<ul>
<li><a href="https://github.com/moodymudskipper/refactor/"><code>{refactor}</code></a> (to check speed and performance of both the original and refactored version of code)</li>
</ul>
</section>
<section id="code-performance" class="level1">
<h1>Code performance ⏱️</h1>
<section id="benchmarking" class="level2">
<h2 class="anchored" data-anchor-id="benchmarking">Benchmarking</h2>
<ul>
<li><p><a href="https://bench.r-lib.org/"><code>{bench}</code></a> (provides high precision benchmarks for R expressions)</p></li>
<li><p><a href="https://cran.r-project.org/package=microbenchmark"><code>{microbenchmark}</code></a> (provides infrastructure to accurately measure and compare the execution time of R expressions)</p></li>
<li><p><a href="https://CRAN.R-project.org/package=tictoc"><code>{tictoc}</code></a> (provides functions for timing R scripts)</p></li>
<li><p><a href="https://lorenzwalthert.github.io/touchstone/"><code>{touchstone}</code></a> (benchmarking pull requests)</p></li>
</ul>
</section>
<section id="profiling" class="level2">
<h2 class="anchored" data-anchor-id="profiling">Profiling</h2>
<ul>
<li><p><a href="https://cran.r-project.org/package=profvis"><code>{profvis}</code></a> (to profile and visualize profiling data)</p></li>
<li><p><a href="https://r-prof.github.io/proffer/"><code>{proffer}</code></a> (to create friendlier, faster visualizations for profiling data)</p></li>
<li><p><a href="https://r-prof.github.io/jointprof/"><code>{jointprof}</code></a> (to profile packages with native code in C, C++, Fortran, etc.)</p></li>
</ul>
</section>
</section>
<section id="dependencies" class="level1">
<h1>Dependencies ⚖️</h1>
<ul>
<li><p><a href="https://cran.r-project.org/package=pkgdepends"><code>{pkgdepends}</code></a> (to find recursive dependencies of from various sources)</p></li>
<li><p><a href="https://cran.r-project.org/package=deepdep"><code>{deepdep}</code></a> (to visualize and explore package dependencies)</p></li>
<li><p><a href="https://github.com/r-lib/itdepends/"><code>{itdepends}</code></a> (to assess usage, measure weights, visualize proportions, and assist removal of dependencies)</p></li>
<li><p><a href="https://github.com/datastorm-open/DependenciesGraphs/"><code>{DependenciesGraphs}</code></a> (to visualize package dependencies)</p></li>
<li><p><a href="https://uptake.github.io/pkgnet/"><code>{pkgnet}</code></a> (to build a graph representation of a package and its dependencies)</p></li>
<li><p><a href="https://cran.r-project.org/package=functiondepends"><code>{functiondepends}</code></a> (to find functions in an unstructured directory and explore their dependencies)</p></li>
<li><p><a href="https://cran.r-project.org/package=pkgndep"><code>{pkgndep}</code></a> (checks the heaviness of the packages used)</p></li>
<li><p><a href="https://sonatype-nexus-community.github.io/oysteR/"><code>{oysteR}</code></a> (to secure package against insecure dependencies)</p></li>
<li><p><a href="https://github.com/ThinkR-open/attachment/"><code>{attachment}</code></a> (to deal with package dependencies during package development)</p></li>
</ul>
</section>
<section id="cranbioconductor-checks-submission-and-status" class="level1">
<h1>CRAN/Bioconductor checks, submission, and status 📬</h1>
<ul>
<li><p><a href="https://r-lib.github.io/rcmdcheck/"><code>{rcmdcheck}</code></a> (to run <code>R CMD check</code> form R programmatically)</p></li>
<li><p><a href="https://github.com/Bioconductor/BiocCheck/"><code>{BiocCheck}</code></a> (to run Bioconductor-specific package checks)</p></li>
<li><p><a href="https://cran.r-project.org/package=rhub"><code>{rhub}</code></a> (to run <code>R CMD check</code> on CRAN architectures)</p></li>
<li><p><a href="https://thinkr-open.github.io/checkhelper/"><code>{checkhelper}</code></a> (to help avoid problems with CRAN submissions)</p></li>
<li><p><a href="https://cran.r-project.org/package=foghorn"><code>{foghorn}</code></a> (to check for results and submission portal status)</p></li>
<li><p><a href="https://github.com/r-lib/urlchecker/"><code>{urlchecker}</code></a> (to checks for URL rot)</p></li>
</ul>
</section>
<section id="usage" class="level1">
<h1>Usage 🙈</h1>
<ul>
<li><p><a href="https://r-hub.github.io/cranlogs/"><code>{cranlogs}</code></a> (for computing CRAN download counts)</p></li>
<li><p><a href="https://cran.r-project.org/package=packageRank"><code>{packageRank}</code></a> (for visualizing CRAN download counts)</p></li>
<li><p><a href="https://guangchuangyu.github.io/dlstats/"><code>{dlstats}</code></a> (provides download statistics for packages)</p></li>
</ul>
</section>
<section id="cicd" class="level1">
<h1>CI/CD 📟</h1>
<p>CI/CD: continuous integration and either continuous delivery or continuous deployment</p>
<ul>
<li><p><a href="https://github.com/r-lib/actions/"><code>actions</code></a> (for <a href="https://github.com/features/actions">GitHub Actions</a>)</p></li>
<li><p><a href="https://github.com/krlmlr/r-appveyor/"><code>r-appveyor</code></a> (for <a href="https://www.appveyor.com/">AppVeyor</a>)</p></li>
<li><p><a href="https://docs.ropensci.org/tic/"><code>{tic}</code></a> (for <a href="https://circleci.com/">Circle CI</a> and <a href="https://github.com/features/actions/">GitHub Actions</a>)</p></li>
<li><p><a href="https://docs.ropensci.org/circle/"><code>{circle}</code></a> (for <a href="https://circleci.com/">Circle CI</a>)</p></li>
<li><p><a href="https://docs.ropensci.org/jenkins/"><code>{jenkins}</code></a> (for <a href="https://www.jenkins.io/">Jenkins CI</a>)</p></li>
<li><p><a href="https://github.com/bnosac/cronR/"><code>{cronR}</code></a> (to schedule R scripts/processes with the cron scheduler)</p></li>
</ul>
</section>
<section id="securityprivacy" class="level1">
<h1>Security/Privacy 👮</h1>
<ul>
<li><p><a href="https://cran.r-project.org/package=digest"><code>{digest}</code></a> (for the creation of hash digests of arbitrary R objects)</p></li>
<li><p><a href="https://cran.r-project.org/package=hash"><code>{hash}</code></a> (implements a data structure similar to hashes in Perl and dictionaries in Python but with a purposefully R flavor)</p></li>
<li><p><a href="https://cran.r-project.org/package=gpg"><code>{gpg}</code></a> (GNU privacy guard for R)</p></li>
</ul>
</section>
<section id="build-systems" class="level1">
<h1>Build systems</h1>
<ul>
<li><a href="https://cran.r-project.org/package=fakemake"><code>{fakemake}</code></a> (to mock Unix Make build system in case it is unavailable)</li>
</ul>
</section>
<section id="validation-frameworks" class="level1">
<h1>Validation frameworks</h1>
<ul>
<li><a href="https://phuse-org.github.io/valtools/"><code>{valtools}</code></a> (in clinical research and drug development)</li>
</ul>
</section>
<section id="debugging" class="level1">
<h1>Debugging 🔭</h1>
<ul>
<li><p><a href="https://github.com/r-lib/debugme/"><code>{debugme}</code></a> (provides helpers to specify debug messages as special string constants, and control debugging of packages via environment variables)</p></li>
<li><p><a href="https://cran.r-project.org/package=debugr"><code>{debugr}</code></a> (tools to print out the value of R objects/expressions while running an R script)</p></li>
<li><p><a href="https://r-prof.github.io/winch/"><code>{winch}</code></a> (provides stack traces for call chains that cross between R and C/C++ function calls)</p></li>
<li><p><a href="https://moodymudskipper.github.io/flow/"><code>{flow}</code></a> (to visualize as flow diagrams the logic of functions, expressions, or scripts, which can ease debugging)</p></li>
<li><p><a href="https://github.com/moodymudskipper/boomer/"><code>{boomer}</code></a> (provides debugging tools to inspect the intermediate steps of a call)</p></li>
</ul>
</section>
<section id="input-validation" class="level1">
<h1>Input validation 🔬</h1>
<ul>
<li><p><a href="https://mllg.github.io/checkmate/"><code>{checkmate}</code></a> (fast and versatile argument checks)</p></li>
<li><p><a href="https://cran.r-project.org/package=assertthat"><code>{assertthat}</code></a> (to declare the pre and post conditions that you code should satisfy and to produce friendly error messages)</p></li>
<li><p><a href="https://bitbucket.org/richierocks/assertive/src/master/"><code>{assertive}</code></a> (provides readable check functions to ensure code integrity)</p></li>
<li><p><a href="https://github.com/RDocTaskForce/pkgcond/"><code>{pkgcond}</code></a> (better error messages for package users)</p></li>
<li><p><a href="https://github.com/lrberge/dreamerr/"><code>{dreamerr}</code></a> (a simple and intuitive, yet powerful and flexible, way to check the arguments passed to a function and to offer informative error messages)</p></li>
<li><p><a href="https://flujoo.github.io/erify/"><code>{erify}</code></a> (to check arguments and generate readable error messages)</p></li>
<li><p><a href="https://github.com/data-cleaning/validate/"><code>{validate}</code></a> (to check whether data lives up to expectations based on the domain-specific knowledge)</p></li>
</ul>
</section>
<section id="package-metadata" class="level1">
<h1>Package metadata 🖨</h1>
<ul>
<li><p><a href="https://docs.ropensci.org/codemetar/"><code>{codemetar}</code></a> (provides utilities to generate, parse, and modify <code>codemeta.jsonld</code> files automatically for R packages), or <a href="https://github.com/cboettig/codemeta/"><code>{codemeta}</code></a> (a leaner version of <code>{codemetar}</code>)</p></li>
<li><p><a href="https://docs.ropensci.org/cffr/"><code>{cffr}</code></a> (provides utilities to generate, parse, modify and validate <code>CITATION.cff</code> files automatically for R packages)</p></li>
<li><p><a href="https://github.com/r-lib/pkgapi/"><code>{pkgapi}</code></a> (to create the map of function calls in a package)</p></li>
<li><p><a href="https://github.com/sfirke/packagemetrics/"><code>{packagemetrics}</code></a> (for comparing among packages)</p></li>
<li><p><a href="https://martinctc.github.io/devtoolbox/"><code>{devtoolbox}</code></a> (to create a summary report for R package and to extract dependency statistics in a tidy data frame)</p></li>
<li><p><a href="https://rich-iannone.github.io/pkgattrs/"><code>{pkgattrs}</code></a> (useful for getting information on the contents of any R package)</p></li>
<li><p><a href="https://github.com/yonicd/foreman/"><code>{foreman}</code></a> (for unpacking, interrogating and subsetting R packages)</p></li>
<li><p><a href="https://r-lib.github.io/sessioninfo/"><code>{sessioninfo}</code></a> (to include R session information)</p></li>
</ul>
</section>
<section id="reverse-dependency-checks" class="level1">
<h1>Reverse dependency checks 📡⚰️</h1>
<ul>
<li><p><a href="https://r-lib.github.io/revdepcheck/"><code>{revdepcheck}</code></a> (for automated, isolated, reverse dependency checking)</p></li>
<li><p><a href="https://yihui.org/xfun/"><code>{xfun}</code></a> (specifically, <code>xfun::rev_check()</code>)</p></li>
</ul>
</section>
<section id="gratitude" class="level1">
<h1>Gratitude 🙏💌</h1>
<p>To thank the contributors or maintainers of packages you rely on.</p>
<ul>
<li><p><a href="https://cran.r-project.org/package=thankr"><code>{thankr}</code></a> (to find out who maintains the packages you are using)</p></li>
<li><p><a href="https://docs.ropensci.org/allcontributors/"><code>{allcontributors}</code></a> (to help acknowledge all contributions)</p></li>
</ul>
</section>
<section id="docker-container" class="level1">
<h1>Docker container 🛍</h1>
<ul>
<li><p><a href="https://o2r.info/containerit/"><code>{containerit}</code></a> (to package R script/session/workspace and all dependencies as a <code>Docker</code> container by generating a suitable <code>Dockerfile</code>)</p></li>
<li><p><a href="https://tidylab.github.io/usethat/"><code>{usethat}</code></a> (to automate analytic project setup tasks)</p></li>
</ul>
</section>
<section id="integration-with-other-languages" class="level1">
<h1>Integration with other languages 🔗</h1>
<section id="c" class="level2">
<h2 class="anchored" data-anchor-id="c">C++</h2>
<ul>
<li><p><a href="https://cran.r-project.org/package=Rcpp"><code>{Rcpp}</code></a></p></li>
<li><p><a href="https://cpp11.r-lib.org"><code>{cpp11}</code></a></p></li>
</ul>
</section>
<section id="fortran" class="level2">
<h2 class="anchored" data-anchor-id="fortran">Fortran</h2>
<ul>
<li><a href="https://github.com/t-kalinowski/RFI"><code>{RFI}</code></a></li>
</ul>
</section>
<section id="python" class="level2">
<h2 class="anchored" data-anchor-id="python">Python</h2>
<ul>
<li><a href="https://cran.r-project.org/package=reticulate"><code>{reticulate}</code></a></li>
</ul>
</section>
<section id="rust" class="level2">
<h2 class="anchored" data-anchor-id="rust">Rust</h2>
<ul>
<li><p><a href="https://cran.r-project.org/package=rextendr"><code>{rextendr}</code></a></p></li>
<li><p><a href="https://cran.r-project.org/package=cargo"><code>{cargo}</code></a></p></li>
<li><p><a href="https://github.com/r-rust/hellorust"><code>{hellorust}</code></a></p></li>
</ul>
</section>
<section id="net-framework" class="level2">
<h2 class="anchored" data-anchor-id="net-framework">.NET Framework</h2>
<ul>
<li><a href="https://github.com/rdotnet/rClr/"><code>{rClr}</code></a></li>
</ul>
</section>
<section id="javascripthtmlcss" class="level2">
<h2 class="anchored" data-anchor-id="javascripthtmlcss">JavaScript/HTML/CSS</h2>
<ul>
<li><a href="https://CRAN.R-project.org/package=htmltools"><code>{htmltools}</code></a></li>
<li><a href="https://packer.john-coene.com/"><code>{packer}</code></a></li>
</ul>
</section>
<section id="julia" class="level2">
<h2 class="anchored" data-anchor-id="julia">Julia</h2>
<ul>
<li><a href="https://non-contradiction.github.io/JuliaCall/"><code>{JuliaCall}</code></a></li>
</ul>
</section>
</section>
<section id="upkeep" class="level1">
<h1>Upkeep 🧹</h1>
<ul>
<li><a href="https://github.com/dokato/todor/"><code>{TODOr}</code></a> (RStudio addin to list things that you need to do or change)</li>
</ul>
</section>
<section id="sundry" class="level1">
<h1>Sundry 🗒</h1>
<ul>
<li><p><a href="https://github.com/dreamRs/prefixer/"><code>{prefixer}</code></a> (prefix function with their namespace )</p></li>
<li><p><a href="https://rstudio.github.io/rstudioapi/"><code>{rstudioapi}</code></a> (to conditionally access the RStudio API from CRAN packages)</p></li>
<li><p><a href="https://hughjonesd.shinyapps.io/rcheology/"><code>{rcheology}</code></a> (to access data on base packages for previous versions of R)</p></li>
<li><p><a href="https://cran.r-project.org/package=gitignore"><code>{gitignore}</code></a> (to fetch gitignore templates)</p></li>
<li><p><a href="https://cran.r-project.org/package=DIZutils"><code>{DIZutils}</code></a> (helpers for packages dealing with database connections)</p></li>
</ul>
</section>
</main>
<!-- /main column -->
<script id="quarto-html-after-body" type="application/javascript">
window.document.addEventListener("DOMContentLoaded", function (event) {
const toggleBodyColorMode = (bsSheetEl) => {
const mode = bsSheetEl.getAttribute("data-mode");
const bodyEl = window.document.querySelector("body");
if (mode === "dark") {
bodyEl.classList.add("quarto-dark");
bodyEl.classList.remove("quarto-light");
} else {
bodyEl.classList.add("quarto-light");
bodyEl.classList.remove("quarto-dark");
}
}
const toggleBodyColorPrimary = () => {
const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
if (bsSheetEl) {
toggleBodyColorMode(bsSheetEl);
}
}
toggleBodyColorPrimary();
const icon = "";
const anchorJS = new window.AnchorJS();
anchorJS.options = {
placement: 'right',
icon: icon
};
anchorJS.add('.anchored');
const clipboard = new window.ClipboardJS('.code-copy-button', {
target: function(trigger) {
return trigger.previousElementSibling;
}
});
clipboard.on('success', function(e) {
// button target
const button = e.trigger;
// don't keep focus
button.blur();
// flash "checked"
button.classList.add('code-copy-button-checked');
var currentTitle = button.getAttribute("title");
button.setAttribute("title", "Copied!");
let tooltip;
if (window.bootstrap) {
button.setAttribute("data-bs-toggle", "tooltip");
button.setAttribute("data-bs-placement", "left");
button.setAttribute("data-bs-title", "Copied!");
tooltip = new bootstrap.Tooltip(button,
{ trigger: "manual",
customClass: "code-copy-button-tooltip",
offset: [0, -8]});
tooltip.show();
}
setTimeout(function() {
if (tooltip) {
tooltip.hide();
button.removeAttribute("data-bs-title");
button.removeAttribute("data-bs-toggle");
button.removeAttribute("data-bs-placement");
}
button.setAttribute("title", currentTitle);
button.classList.remove('code-copy-button-checked');
}, 1000);
// clear code selection
e.clearSelection();
});
function tippyHover(el, contentFn) {
const config = {
allowHTML: true,
content: contentFn,
maxWidth: 500,
delay: 100,
arrow: false,
appendTo: function(el) {
return el.parentElement;
},
interactive: true,
interactiveBorder: 10,
theme: 'quarto',
placement: 'bottom-start'
};
window.tippy(el, config);
}
const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
for (var i=0; i<noterefs.length; i++) {
const ref = noterefs[i];
tippyHover(ref, function() {
// use id or data attribute instead here
let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
try { href = new URL(href).hash; } catch {}
const id = href.replace(/^#\/?/, "");
const note = window.document.getElementById(id);
return note.innerHTML;
});
}
const findCites = (el) => {
const parentEl = el.parentElement;
if (parentEl) {
const cites = parentEl.dataset.cites;
if (cites) {
return {
el,
cites: cites.split(' ')
};
} else {
return findCites(el.parentElement)
}
} else {
return undefined;
}
};
var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
for (var i=0; i<bibliorefs.length; i++) {
const ref = bibliorefs[i];
const citeInfo = findCites(ref);
if (citeInfo) {
tippyHover(citeInfo.el, function() {
var popup = window.document.createElement('div');
citeInfo.cites.forEach(function(cite) {
var citeDiv = window.document.createElement('div');
citeDiv.classList.add('hanging-indent');
citeDiv.classList.add('csl-entry');
var biblioDiv = window.document.getElementById('ref-' + cite);
if (biblioDiv) {
citeDiv.innerHTML = biblioDiv.innerHTML;
}
popup.appendChild(citeDiv);
});
return popup.innerHTML;
});
}
}
});
</script>
</div> <!-- /content -->
</body></html>