{"id":14069072,"url":"https://github.com/ropensci-archive/PackageDevelopment","last_synced_at":"2025-07-30T05:31:11.656Z","repository":{"id":31278338,"uuid":"34840236","full_name":"ropensci-archive/PackageDevelopment","owner":"ropensci-archive","description":":no_entry: ARCHIVED :no_entry: ","archived":true,"fork":false,"pushed_at":"2022-05-10T13:48:13.000Z","size":366,"stargazers_count":43,"open_issues_count":0,"forks_count":6,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-05-23T02:39:33.022Z","etag":null,"topics":["cran","r","r-package","ropensci","task-view"],"latest_commit_sha":null,"homepage":"","language":"R","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/ropensci-archive.png","metadata":{"files":{"readme":"README-NOT.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-04-30T07:20:22.000Z","updated_at":"2023-01-28T00:55:50.000Z","dependencies_parsed_at":"2022-09-09T07:40:27.201Z","dependency_job_id":null,"html_url":"https://github.com/ropensci-archive/PackageDevelopment","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci-archive%2FPackageDevelopment","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci-archive%2FPackageDevelopment/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci-archive%2FPackageDevelopment/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci-archive%2FPackageDevelopment/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ropensci-archive","download_url":"https://codeload.github.com/ropensci-archive/PackageDevelopment/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228092128,"owners_count":17868139,"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":["cran","r","r-package","ropensci","task-view"],"created_at":"2024-08-13T07:06:35.266Z","updated_at":"2024-12-04T10:30:53.288Z","avatar_url":"https://github.com/ropensci-archive.png","language":"R","funding_links":[],"categories":["R"],"sub_categories":[],"readme":"CRAN Task View: Package Development\n-----------------------------------\n\n*Do not edit this README by hand. See [CONTRIBUTING.md](CONTRIBUTING.md).*\n\n| | |\n|---|---|\n|-----------------|------------------------------------------------------|\n| **Maintainer:** | Thomas J. Leeper                                     |\n| **Contact:**    | thosjleeper at gmail.com                             |\n| **Version:**    | 2018-07-31                                           |\n| **URL:**        | \u003chttps://CRAN.R-project.org/view=PackageDevelopment\u003e |\n\nPackages provide a mechanism for loading optional code, data, and documentation as needed. At the very minimum only a text editor and an R installation are needed for package creation. Nonetheless many useful tools and R packages themselves have been provided to ease or improve package development. This Task View focuses on these tools/R packages, grouped by topics.\n\nThe main reference for packages development is the [\"Writing R Extension\"](http://cran.r-project.org/doc/manuals/R-exts.html) manual. For further documentation and tutorials, see the \"Related links\" section below.\n\nIf you think that some packages or tools are missing from the list, feel free to [e-mail](mailto:thosjleeper@gmail.com) me or contribute directly to the Task View by submitting a pull request on [GitHub](https://github.com/ropensci/PackageDevelopment/blob/master/CONTRIBUTING.md).\n\nMany thanks to Christopher Gandrud, Cristophe Dutang, Darren Norris, Dirk Eddelbuettel, Gabor Grothendieck, Gregory Jefferis, John Maindonald, Luca Braglia, Spencer Graves, Tobias Verbeke, and the R-core team for contributions.\n\nFirst steps\n-----------\n\n### Searching for Existing Packages\n\nBefore starting a new package it's worth searching for already available packages, both from a developer's standpoint (\"do not reinvent the wheel\") and from a user's one (many packages implementing same/similar procedures can be confusing). If a package addressing the same functionality already exists, you may consider contributing at it instead of starting a new one.\n\n-   `utils::RSiteSearch()` allows to search for keywords/phrases in help pages (all the CRAN packages except those for Windows only and some from Bioconductor), vignettes or task views, using the search engine at \u003ca href=\"http://search.r-project.org/\" class=\"uri\" class=\"uri\"\u003ehttp://search.r-project.org/\u003c/a\u003e. A convenient wrapper around `RSiteSearch` that adds hits ranking is `findFn()` function, from [sos](http://cran.rstudio.com/web/packages/sos/index.html).\n-   [RSeek](http://rseek.org/) allows to search for keywords/phrases in books, task views, support lists, function/packages, blogs etc.\n-   [Rdocumentation](https://www.rdocumentation.org/) allows to search for keywords/phrases in help pages for all CRAN and some Bioconductor/GitHub packages. [RDocumentation](http://cran.rstudio.com/web/packages/RDocumentation/index.html) ([GitHub](https://github.com/datacamp/RDocumentation/)) provides an R client for the site.\n-   \u003ca href=\"http://www.r-pkg.org/\" class=\"uri\" class=\"uri\"\u003ehttp://www.r-pkg.org/\u003c/a\u003e is an unofficial CRAN mirror that provides a relatively complete archive of package and read-only access to package sources on Github.\n-   [CRANberries](http://dirk.eddelbuettel.com/cranberries/) provides a feed of new, updated, and removed packages for CRAN.\n-   If you're looking to create a package, but want ideas for what sorts of packages are in demand, the [rOpenSci](https://ropensci.org/) maintains [a wishlist for science-related packages](https://github.com/ropensci/wishlist) and [a TODO list of web services and data APIs in need of packaging](https://github.com/ropensci/webservices/wiki/ToDo).\n\n### Initializing an R package\n\n-   `utils::package.skeleton()` automates some of the setup for a new source package. It creates directories, saves functions, data, and R code files provided to appropriate places, and creates skeleton help files and a `Read-and-delete-me` file describing further steps in packaging\n-   `create()` from [devtools](http://cran.rstudio.com/web/packages/devtools/index.html) is similar to `package.skeleton` except it allows to specify `DESCRIPTION` entries and doesn't create source code and data files from global environment objects or sourced files.\n-   Non-devtools alternatives also exist. `kitten()` from [pkgKitten](http://cran.rstudio.com/web/packages/pkgKitten/index.html) allows one to specify the main `DESCRIPTION` entries and doesn't create source code and data files from global environment objects or sourced files. It's used to initialize a simple package that passes `R CMD check` cleanly. [skeletor](http://cran.rstudio.com/web/packages/skeletor/index.html) provides another non-devtools skeleton-building function with a wider set of defaults and options.\n-   [mason](https://github.com/metacran/mason) (not the package on CRAN of the same name) provides a fun, interactive tool for creating a package based on a variety of inputs.\n-   [available](http://cran.rstudio.com/web/packages/available/index.html) ([GitHub](https://github.com/ropenscilabs/available)) checks whether a package name is available and checks for unintended (typically bad) meanings in a potential package name.\n-   `Rcpp.package.skeleton()` from [Rcpp](http://cran.rstudio.com/web/packages/Rcpp/index.html) adds to `package.skeleton` the C++ via `Rcpp` handling, by modifying eg. `DESCRIPTION` and `NAMESPACE` accordingly, creating examples if needed and allowing the user to specify (with a character vector of paths) which C++ files to include in `src` directory . Finally the user can decide main `DESCRIPTION` entries.\n-   [mvbutils](http://cran.rstudio.com/web/packages/mvbutils/index.html) provides a variety of useful functions for development which include tools for managing and analyzing the development environment, auto-generating certain function types, and visualizing a function dependency graph. [pagerank](https://github.com/andrie/pagerank) (not on CRAN) can calculate a package's PageRank from its dependency graph.\n-   [swagger](https://github.com/hrbrmstr/swagger) (not on CRAN) uses the [Swagger](http://swagger.io/) JSON web service API specification to automatically generate an R client package for a web service API.\n\nR packages require a `Version` string in the `DESCRIPTION` file. Traditionally, packages have been versioned using a `MAJOR.MINOR-PATCH` format, sometimes using the version's date as the `PATCH` component. More recently, [semantic versioning](http://semver.org/) has become common. [semver](http://cran.rstudio.com/web/packages/semver/index.html) ([GitHub](https://github.com/johndharrison/semver)) provides tools to parse and manipulate semantic version strings.\n\nWhen initializing a package, it is worth considering how it should be licensed. CRAN provides [a list of the most commonly used software licences](https://cran.r-project.org/web/licenses/) for R packages. [osi](http://cran.rstudio.com/web/packages/osi/index.html) ([GitHub](https://github.com/Ironholds/osi/)) provides a more comprehensive list in a standardized format.\n\n### Programming Paradigms\n\nR is foremost a functional programming language with dynamic typing, but has three built-in forms of object-oriented programming as well as additional object-oriented paradigms available in add-on packages.\n\n-   The built-in S3 classes involve wherein a generic function (e.g., `summary`) employs a distinct method for an object of a given class (i.e., it is possible to implement class-specific methods for a given generic function). If a package implements new object classes, it is common to implement methods for commonly used generics such as `print`, `summary`, etc. These methods must be registered in the package's NAMESPACE file. [R.methodsS3](http://cran.rstudio.com/web/packages/R.methodsS3/index.html) aims to simplify the creation of S3 generic functions and S3 methods.\n-   S4 is a more formalized form of object orientation that is available through `methods`. S4 classes have formal definitions and can dispatch methods based on multiple arguments (not just the first argument, as in S3). S4 is notable for its use of the `@` symbol to extract slots from S4 objects. John Chambers's [\"How S4 Methods Work\"](http://developer.r-project.org/howMethodsWork.pdf) tutorial may serve as a useful introduction.\n-   Reference classes were introduced in R2.12.0 and are also part of `methods`. They offer a distinct paradigm from S3 and S4 due to the fact that reference class objects are mutable and that methods belong to objects, not generic functions.\n-   [aoos](http://cran.rstudio.com/web/packages/aoos/index.html) and [R.oo](http://cran.rstudio.com/web/packages/R.oo/index.html) are other packages facilitating object-oriented programming. [R6](http://cran.rstudio.com/web/packages/R6/index.html) ([Github](https://github.com/wch/R6)) provides an alternative to reference classes without a dependency on `methods`.\n-   [proto](http://cran.rstudio.com/web/packages/proto/index.html) provides a prototype-based object orientated programming paradigm.\n-   [rtype](http://cran.rstudio.com/web/packages/rtype/index.html) provides a strong type system.\n-   [argufy](https://github.com/gaborcsardi/argufy) (Not on CRAN), provides a syntax for creating functions with strictly typed arguments, among other possible checks.\n-   [lambda.r](http://cran.rstudio.com/web/packages/lambda.r/index.html), [lambdaR](https://github.com/hoxo-m/lambdaR) (not on CRAN), and [purrr](http://cran.rstudio.com/web/packages/purrr/index.html) provide interfaces for creating lambda (anonymous) functions.\n-   [functools](http://cran.rstudio.com/web/packages/functools/index.html) ([GitHub](https://github.com/paulhendricks/functools)) provides higher-order functions (Map, Reduce, etc.) common in funcitonal programming.\n-   [later](http://cran.rstudio.com/web/packages/later/index.html) ([GitHub](https://github.com/r-lib/later)) provides the ability to postpone execution of R or C code.\n\nAnother feature of R is the ability to rely on both standard and non-standard evaluation of function arguments. Non-standard evaluation is seen in commonly used functions like `library` and `subset` and can also be used in packages.\n\n-   `substitute()` provides the most straightforward interface to non-standard evaluation of function arguments.\n-   [rlang](http://cran.rstudio.com/web/packages/rlang/index.html) ([Github](https://github.com/tidyverse/rlang)) aims to help developers tools for non-standard evaluation.\n-   An increasingly popular form of non-standard evaluation involves chained expressions or \"pipelines\". [magrittr](http://cran.rstudio.com/web/packages/magrittr/index.html) provides the `%\u003e%` chaining operator that passes the results of one expression evaluation to the next expression in the chain, as well as other similar piping operators. [pipeR](http://cran.rstudio.com/web/packages/pipeR/index.html) offers a larger set of pipe operators. [assertr](http://cran.rstudio.com/web/packages/assertr/index.html) and [ensurer](http://cran.rstudio.com/web/packages/ensurer/index.html) provide (fairly similar) testing frameworks for pipelines.\n\n### Dependency Management\n\nPackages that have dependencies on other packages need to be vigilant of changes to the functionality, behaviour, or API of those packages.\n\n-   [CodeDepends](http://cran.rstudio.com/web/packages/CodeDepends/index.html) provides tools for examining dependencies between blocks of code.\n-   [backports](http://cran.rstudio.com/web/packages/backports/index.html) ([GitHub](https://github.com/mllg/backports)) provides reimplementations of functions added to base R packages since v3.0.0, making them available in older versions of R. This gives package developers the ability to reduce or eliminate a dependency on specific versions of R itself.\n-   [pkgverse](https://github.com/mkearney/pkgverse) (not on CRAN) provides tools for creating an integrated, installable \"universe\" of R packages, in the style of the [\"tidyverse\"](https://www.tidyverse.org/).\n-   [packrat](http://cran.rstudio.com/web/packages/packrat/index.html) ([GitHub](https://github.com/rstudio/packrat)) provides facilities for creating local package repositories to manage and check dependencies.\n-   [checkpoint](http://cran.rstudio.com/web/packages/checkpoint/index.html) relies on the Revolution Analytics MRAN repository to access packages from specified dates.\n-   [pacman](http://cran.rstudio.com/web/packages/pacman/index.html) ([GitHub](https://github.com/trinker/pacman)) can install, uninstall, load, and unload various versions of packages from CRAN and Github.\n-   [GRANBase](http://cran.rstudio.com/web/packages/GRANBase/index.html) ([GitHub](https://github.com/gmbecker/gRAN)) provides some sophisticated tools for managing dependencies and testing packages conditional on changes.\n-   [cranly](http://cran.rstudio.com/web/packages/cranly/index.html) ([GitHub](https://github.com/ikosmidis/cranly)) provides tools for creating and visualizing dependency graphs among packages on CRAN.\n-   Two packages currently provide alternative ways to import objects from packages in non-standard ways (e.g., to assign those objects different names from the names used in their host packages). [import](http://cran.rstudio.com/web/packages/import/index.html) ([GitHub](https://github.com/smbache/import)) can import numerous objects from a namespace and assign arbitrary names. [modules](https://github.com/klmr/modules) (not on CRAN) provides functionality for importing alternative non-package code from Python-like \"modules\".\n-   [Rocker](https://github.com/rocker-org) is an initiative to create Docker configurations for R and packages. [containerit](https://github.com/o2r-project/containerit/) (not on CRAN) can be used to package an R workspace and all dependencies as a Docker container.\n\nSource Code\n-----------\n\n### Foreign Languages Interfaces\n\n-   R's base functions `system()`, `system2()`, and - on Windows - `shell.exec()` - provide interfaces for calling system functions. [sys](http://cran.rstudio.com/web/packages/sys/index.html) ([GitHub](https://github.com/jeroen/sys/)) and [processx](https://github.com/r-pkgs/processx) (not on CRAN) provide unified, platform-independent APIs for running system processes.\n-   [inline](http://cran.rstudio.com/web/packages/inline/index.html) eases adding code in C, C++, or Fortran to R. It takes care of the compilation, linking and loading of embedded code segments that are stored as R strings.\n-   [Rcpp](http://cran.rstudio.com/web/packages/Rcpp/index.html) offers a number of C++ classes that makes transferring R objects to C++ functions (and back) easier. [RInside](http://cran.rstudio.com/web/packages/RInside/index.html) provides C++ classes for embedding within C++ applications.\n-   [rGroovy](http://cran.rstudio.com/web/packages/rGroovy/index.html) integrates with the [Groovy scripting language](http://www.groovy-lang.org/).\n-   [rJava](http://cran.rstudio.com/web/packages/rJava/index.html) provides a low-level interface to Java similar to the `.Call` interface for C and C++. [helloJavaWorld](http://cran.rstudio.com/web/packages/helloJavaWorld/index.html) provides an example rJava-based package. [jvmr](https://dahl.byu.edu/software/jvmr/) (archived on CRAN) provides a bi-directional interface to Java, Scala, and related languages, while [rscala](http://cran.rstudio.com/web/packages/rscala/index.html) is designed specifically for Scala.\n-   [rustr](https://github.com/rustr/rustr) provides bindings to Rust.\n-   [reach](https://github.com/schmidtchristoph/reach) (not on CRAN) and [matlabr](http://cran.rstudio.com/web/packages/matlabr/index.html) provide rough interfaces to Matlab.\n-   [rPython](http://cran.rstudio.com/web/packages/rPython/index.html), [rJython](http://cran.rstudio.com/web/packages/rJython/index.html), [PythonInR](http://cran.rstudio.com/web/packages/PythonInR/index.html), [rpy2](http://rpy.sourceforge.net/) (not on CRAN), and [SnakeCharmR](https://github.com/asieira/SnakeCharmR) (not on CRAN) provide interfaces to python. [reticulate](http://cran.rstudio.com/web/packages/reticulate/index.html) ([GitHub](https://github.com/rstudio/reticulate)) is a relatively recent interface built by RStudio.\n-   [RJulia](https://github.com/armgong/RJulia) (not on CRAN) provides an interface with Julia, as does [XRJulia](http://cran.rstudio.com/web/packages/XRJulia/index.html). [RCall](https://github.com/JuliaInterop/RCall.jl) embeds R within Julia.\n-   [RStata](http://cran.rstudio.com/web/packages/RStata/index.html) is an interface with Stata. [RCall](https://github.com/haghish/Rcall) embeds R in Stata.\n-   `tcltk`, which is a package built in to R, provides an general interface to Tcl, usefully especially for accessing Tcl/tk (for graphical interfaces). [after](https://github.com/gaborcsardi/after) (not on CRAN) uses tcltk to run R code in a separate event loop.\n-   [V8](http://cran.rstudio.com/web/packages/V8/index.html) offers an embedded Javascript engine, useful for building packages around Javascript libraries. [js](http://cran.rstudio.com/web/packages/js/index.html) provides additional tools for working with Javascript code.\n\nThe [knitr](http://cran.rstudio.com/web/packages/knitr/index.html) package, which supplies [various foreign language engines](https://yihui.name/knitr/demo/engines/), can also be used to generate documents that call python, awk, ruby, haskell, bash, perl, dot, tikz, sas, coffeescript, and polyglot.\n\nWriting packages that involve compiled code requires a developer toolchain. If developing on Windows, this requires [Rtools](http://cran.r-project.org/bin/windows/Rtools/), which is updated with each R minor release.\n\n### Debugging\n\n-   [futile.logger](http://cran.rstudio.com/web/packages/futile.logger/index.html), [log4r](http://cran.rstudio.com/web/packages/log4r/index.html), and [logging](http://cran.rstudio.com/web/packages/logging/index.html) provide logging functionality in the style of [log4j](https://en.wikipedia.org/wiki/Log4j).\n-   [loggr](https://github.com/smbache/loggr) (not on CRAN) aims to provide a simplified logging interface without the need for `withCallingHandlers()` expressions.\n-   [rollbar](http://cran.rstudio.com/web/packages/rollbar/index.html) reports messages and errors to [Rollbar](https://rollbar.com/), a web service.\n-   The [rchk](https://github.com/kalibera/rchk) tool provides tools for identifying memory-protection bugs in C code, including base R and packages.\n\n### Code Analysis and Formatting\n\n-   [codetools](http://cran.rstudio.com/web/packages/codetools/index.html) provides a number of low-level functions for identifying possible problems with source code.\n-   [lintr](http://cran.rstudio.com/web/packages/lintr/index.html) provides tools for checking source code compliance with a style guide.\n-   [formatR](http://cran.rstudio.com/web/packages/formatR/index.html) and [rfmt](https://github.com/google/rfmt/) (not on CRAN) can be used to neatly format source code.\n-   [FuncMap](http://cran.rstudio.com/web/packages/FuncMap/index.html) provides a graphical representation of function calls used in a package.\n-   [pkggraph](http://cran.rstudio.com/web/packages/pkggraph/index.html) ([GitHub](https://github.com/talegari/pkggraph)) and [functionMap](https://github.com/MangoTheCat/functionMap) provide tools useful for understanding function dependencies within and across packages. [atomize](https://github.com/ropenscilabs/atomize) can quickly extract functions from within a package into their own package. [requirements](https://github.com/hadley/requirements) (not on CRAN) checks R code files for implicit and explicit package dependencies.\n-   [pkgnet](http://cran.rstudio.com/web/packages/pkgnet/index.html) ([GitHub](https://github.com/UptakeOpenSource/pkgnet)) uses concepts from graph theory to quantify the complexity and vulnerability to failure of a software package based upon dependencies between functions and between package dependencies.\n\n### Profiling\n\n-   Profiling data is provided by `utils::Rprof()` and can be summarized by `utils::summaryRprof()`. [prof.tree](http://cran.rstudio.com/web/packages/prof.tree/index.html) ([GitHub](https://github.com/artemklevtsov/prof.tree)) provides an alternative output data structure to `Rprof()`. [profmem](http://cran.rstudio.com/web/packages/profmem/index.html) ([GitHub](https://github.com/HenrikBengtsson/profmem)) adds a simple interface on top of this.\n-   [profr](http://cran.rstudio.com/web/packages/profr/index.html) can visualize output from the `Rprof` interface for profiling.\n-   [proftools](http://cran.rstudio.com/web/packages/proftools/index.html) and [aprof](http://cran.rstudio.com/web/packages/aprof/index.html) can also be used to analyse profiling output.\n-   [profvis](https://github.com/rstudio/profvis) (not on CRAN) provides an interactive, graphical interface for examining profile results.\n-   [lineprof](https://github.com/hadley/lineprof) (not on CRAN) provides a visualization tool for examining profiling results.\n-   [Rperform](https://github.com/analyticalmonk/Rperform) (not on CRAN) compares package performance across different git versions and branches.\n\n### Benchmarking\n\n-   `base::system.time()` is a basic timing utility that calculates times based on one iteration of an expression.\n-   [microbenchmark](http://cran.rstudio.com/web/packages/microbenchmark/index.html) and [rbenchmark](http://cran.rstudio.com/web/packages/rbenchmark/index.html) provide timings based on multiple iterations of an expression and potentially provide more reliable timings than `system.time()`\n\n### Unit Testing\n\n-   Packages should pass all basic code and documentation checks provided by the `R CMD check` quality assurance tools built in to R. [rcmdcheck](http://cran.rstudio.com/web/packages/rcmdcheck/index.html) provides programmatic access to `R CMD check` from within R and [callr](https://github.com/r-pkgs/callr) (not on CRAN) provides a generic interface for calling R from within R.\n-   R documentation files can contain demonstrative examples of package functionality. Complete testing of correct package performance is better reserved for the `test` directory. Several packages provide testing functionality, including [RUnit](http://cran.rstudio.com/web/packages/RUnit/index.html), [svUnit](http://cran.rstudio.com/web/packages/svUnit/index.html), [testit](http://cran.rstudio.com/web/packages/testit/index.html) ([GitHub](https://github.com/yihui/testit)), [testthat](http://cran.rstudio.com/web/packages/testthat/index.html), [testthatsomemore](https://github.com/robertzk/testthatsomemore) (not on CRAN), and [pkgmaker](http://cran.rstudio.com/web/packages/pkgmaker/index.html). [runittotestthat](http://cran.rstudio.com/web/packages/runittotestthat/index.html) provides utilities for converting exiting RUnit tests to testthat tests.\n-   [unitizer](http://cran.rstudio.com/web/packages/unitizer/index.html) ([GitHub](https://github.com/brodieG/unitizer)) provides tools for regression testing by comparing test output against previous runs of the same tests. The package has extensive vignette-based documentation.\n-   [vdiffr](http://cran.rstudio.com/web/packages/vdiffr/index.html) ([GitHub](https://github.com/lionel-/vdiffr)) can be used for graphical unit tests.\n-   [assertive](http://cran.rstudio.com/web/packages/assertive/index.html), [assertr](http://cran.rstudio.com/web/packages/assertr/index.html), [checkmate](http://cran.rstudio.com/web/packages/checkmate/index.html) [ensurer](http://cran.rstudio.com/web/packages/ensurer/index.html), and [assertthat](http://cran.rstudio.com/web/packages/assertthat/index.html) provide test-like functions for use at run-time or in examples that will trigger messages, warnings, or errors if an R object differs from what is expected by the user or developer.\n-   [mockr](http://cran.rstudio.com/web/packages/mockr/index.html) ([GitHub](https://github.com/krlmlr/mockr)) provides tools to mock a function in a test context. This can be useful for standardizing the test of a function that calls other functions by fixing the output of those function dependencies.\n-   [covr](http://cran.rstudio.com/web/packages/covr/index.html) and [testCoverage](https://github.com/MangoTheCat/testCoverage) (not on CRAN) offer utilities for monitoring how well tests cover a package's source code. These can be complemented by services such as [Codecov](https://codecov.io/) or [Coveralls](https://coveralls.io/) that provide web interfaces for assessing code coverage.\n-   [withr](http://cran.rstudio.com/web/packages/withr/index.html) ([GitHub](https://github.com/jimhester/withr)) provides functions to evaluate code within a temporarily modified global state, which may be useful for unit testing, debugging, or package development.\n-   The `devtools::use_revdep()` and `revdep_check()` functions from [devtools](http://cran.rstudio.com/web/packages/devtools/index.html) can be used to test reverse package dependencies to ensure code changes have not affected downstream package functionality. [crandalf](https://github.com/yihui/crandalf) (not on CRAN) provides an alternative mechanism for testing reverse dependencies.\n\n### Internationalization and Localization\n\n-   There is no standard mechanism for translation of package documentation into languages other than English. To create non-English documentation requires manual creation of supplemental .Rd files or package vignettes. Packages supplying non-English documentation should include a `Language` field in the DESCRIPTION file.\n-   R provides useful features for the localization of diagnostic messages, warnings, and errors from functions at both the C and R levels based on GNU `gettext`. [\"Translating R Messages\"](http://developer.r-project.org/Translations30.html) describes the process of creating and installing message translations.\n\n### Creating Graphical Interfaces\n\n-   For simple interactive interfaces, `readline()` can be used to create a simple prompt. [getPass](http://cran.rstudio.com/web/packages/getPass/index.html) provides cross-platform mechanisms for securely requesting user input without displaying the intput (e.g., for passwords). `utils::menu()`, `utils::select.list()` can provide graphical and console-based selection of items from a list, and `utils::txtProgressBar()` provides a simple text progress bar.\n-   `tcltk` is an R base package that provides a large set of tools for creating interfaces uses Tcl/tk (most functions are thin wrappers around corresponding Tcl and tk functions), though the documentation is sparse. [tcltk2](http://cran.rstudio.com/web/packages/tcltk2/index.html) provides additional widgets and functionality. [qtbase](http://cran.rstudio.com/web/packages/qtbase/index.html) provides bindings for Qt. [\u003cspan class=\"Ohat\"\u003eRGtk\u003c/span\u003e](http://www.Omegahat.net/RGtk/) (not on CRAN) provides bindings for Gtk and gnome. [gWidgets2](http://cran.rstudio.com/web/packages/gWidgets2/index.html) offers a language-independent API for building graphical user interfaces in Gtk, Qt, or Tcl/tk.\n-   [fgui](http://cran.rstudio.com/web/packages/fgui/index.html) can create a Tcl/tk interface for any arbitrary function.\n-   [shiny](http://cran.rstudio.com/web/packages/shiny/index.html) provides a browser-based infrastructure for creating dashboards and interfaces for R functionality. [htmlwidgets](http://cran.rstudio.com/web/packages/htmlwidgets/index.html) is a shiny enhancement that provides a framework for creating HTML widgets.\n-   [progress](http://cran.rstudio.com/web/packages/progress/index.html) ([Github](https://github.com/gaborcsardi/progress)) offers progress bars for the terminal, including a C++ API.\n\n### Command Line Argument Parsing\n\n-   Several packages provide functionality for parsing command line arguments: [argparse](http://cran.rstudio.com/web/packages/argparse/index.html), [argparser](http://cran.rstudio.com/web/packages/argparser/index.html), [commandr](http://cran.rstudio.com/web/packages/commandr/index.html), [docopt](http://cran.rstudio.com/web/packages/docopt/index.html), [GetoptLong](http://cran.rstudio.com/web/packages/GetoptLong/index.html), and [optigrab](http://cran.rstudio.com/web/packages/optigrab/index.html).\n\n### Using Options in Packages\n\n-   [pkgconfig](http://cran.rstudio.com/web/packages/pkgconfig/index.html) ([GitHu](https://github.com/gaborcsardi/pkgconfig)) allows developers to set package-specific options, which will not affect options set or used by other packages.\n\nDocumentation\n-------------\n\n### Writing Package Documentation\n\nPackage documentation is written in a TeX-like format as .Rd files that are stored in the `man` subdirectory of a package. These files are compiled to plain text, HTML, or PDF by R as needed.\n\n-   One can write .Rd files directly. A popular alternative is to rely on [roxygen2](http://cran.rstudio.com/web/packages/roxygen2/index.html), which uses special markup in R source files to generate documentation files before a package is built. This functionality is provided by `roxygen2::roxygenise()` and underlies `devtools::document()`. roxygen2 eliminates the need to learn *some* of the formatting requirements of an .Rd file at the cost of adding a step to the development process (the need to roxygenise before calling `R CMD build`). Recent versions of roxygen2 support full markdown-based documentation without the need for any native Rd formatting.\n-   [Rd2roxygen](http://cran.rstudio.com/web/packages/Rd2roxygen/index.html) can convert existing .Rd files to roxygen source documentation, facilitating the conversion of existing documentation to an roxygen workflow. [roxygen2md](https://github.com/r-pkgs/roxygen2md) (not on CRAN) provides tools for further converting Rd markup within roxygen comments to markdown format (supported by the latest versions of roxygen2).\n-   [roxyPackage](https://github.com/unDocUMeantIt/roxyPackage) (not on CRAN) provides some additional functionality for maintaining package documentation.\n-   [inlinedocs](http://cran.rstudio.com/web/packages/inlinedocs/index.html) and [documair](http://cran.rstudio.com/web/packages/documair/index.html) provide further alternative documentation schemes based on source code commenting.\n-   `tools::parse_Rd()` can be used to manipulate the contents of an .Rd file. `tools::checkRd()` is useful for validating an .Rd file. Duncan Murdoch's [\"Parsing Rd files\"](https://developer.r-project.org/parseRd.pdf) tutorial is a useful reference for advanced use of R documentation. [Rdpack](http://cran.rstudio.com/web/packages/Rdpack/index.html) provides additional tools for manipulating documentation files.\n-   [packagedocs](http://cran.rstudio.com/web/packages/packagedocs/index.html) and [pkgdown](http://cran.rstudio.com/web/packages/pkgdown/index.html) can be used to generate static websites from R documentation files.\n\n### Writing Vignettes\n\nPackage vignettes provides additional documentation of package functionality that is not tied to a specific function (as in an .Rd file). Historically, vignettes were used to explain the statistical or computational approach taken by a package in an article-like format that would be rendered as a PDF document using `Sweave`. Since R 3.0.0, non-Sweave vignette engines have also been supported, including [knitr](http://cran.rstudio.com/web/packages/knitr/index.html), which can produce Sweave-like PDF vignettes but can also support HTML vignettes that are written in R-flavored markdown. To use a non-Sweave vignette engine, the vignette needs to start with a code block indicating the package and function to be used:\n\n\u003e % %\n\n### Spell Checking\n\n-   `utils` provides multiple functions for spell-checking portions of packages, including .Rd files ( `utils::aspell_package_Rd_files`) and vignettes ( `utils::aspell_package_vignettes`) via the general purpose `aspell` function, which requires a system spell checking library, such as http://aspell.net/, http://hunspell.github.io/, or https://www.cs.hmc.edu/~geoff/ispell.html.\n-   [hunspell](http://cran.rstudio.com/web/packages/hunspell/index.html) provides an interface to hunspell.\n\n### Data in Packages\n\n-   [lazyData](http://cran.rstudio.com/web/packages/lazyData/index.html) offers the ability to use data contained within packages that have not been configured using LazyData.\n\nTools and Services\n------------------\n\n### Text Editors and IDEs\n\n-   By far the most popular [integrated development environment (IDE)](https://en.wikibooks.org/wiki/R_Programming/Settings) for R is [RStudio](https://www.rstudio.com/), which is an open-source product available with both commercial and AGPL licensing. It can be run both locally and on a remote server. [rstudioapi](http://cran.rstudio.com/web/packages/rstudioapi/index.html) facilitates interaction from RStudio from within R.\n-   [StatET](http://www.walware.de/goto/statet) is an R plug-in for the Eclipse IDE.\n-   [Emacs Speaks Statistics (ESS)](http://ess.r-project.org/) is a feature-rich add-on package for editors like Emacs or XEmacs.\n\n### Makefiles\n\n-   [GNU Make](http://www.gnu.org/software/make/) is a tool that typically builds executable programs and libraries from source code by reading files called `Makefile`. It can be used to manage R package as well; [maker](https://github.com/ComputationalProteomicsUnit/maker) is a `Makefile` completely devoted to R package development based on [makeR](https://github.com/tudo-r/makeR).\n-   [remake](https://github.com/richfitz/remake) (not on CRAN) provides a yaml-based, Makefile-like format that can be used in Make-like workflows from within R.\n\n### Version Control\n\n-   R itself is maintained under version control using [Subversion](https://subversion.apache.org/).\n-   Many packages are maintained using [git](https://git-scm.com/), particularly those hosted on [GitHub](https://github.com/). [git2r](http://cran.rstudio.com/web/packages/git2r/index.html) ([Github](https://github.com/ropensci/git2r)) provides bindings to [libgit2](https://libgit2.github.com/) for programmatic use of git within R.\n\n### Hosting and Package Building Services\n\nMany [hosting services](https://en.wikipedia.org/wiki/Comparison_of_open-source_software_hosting_facilities) are available. Use of different hosts depends largely on what type of version control software is used to maintain a package. The most common sites are:\n\n-   [R-Forge](http://r-forge.r-project.org/), which relies on [Subversion](http://subversion.apache.org/). [Rforge.net](https://rforge.net/) is another popular Subversion-based system.\n-   [r-hub](http://log.r-hub.io/) is a modern package test service funded by the RConsortium . [rhub](http://cran.rstudio.com/web/packages/rhub/index.html) ([GitHub](https://github.com/r-hub/rhub)) provides an R client for the site's API.\n-   [GitHub](https://github.com/) [mainly](https://help.github.com/articles/support-for-subversion-clients/) supports Git and Mercurial. Packages hosted on Github can be installed directly using `devtools::install_github()` or `remotes::install_github()` from [remotes](http://cran.rstudio.com/web/packages/remotes/index.html). [gh](https://github.com/r-pkgs/gh) (not on CRAN) is a lightweight client for the GitHub API. [githubtools](https://github.com/jonocarroll/githubtools) (not on CRAN) provides some resources for including GitHub-related links in package documentation and for analyzing packages installed from GitHub.\n-   [Bitbucket](https://bitbucket.org/) is an alternative host that provides no-cost private repositories and [GitLab](https://about.gitlab.com/) is an open source alternative. [gitlabr](http://cran.rstudio.com/web/packages/gitlabr/index.html) provides is an API client for managing Gitlab projects.\n-   Github supports [continuous integration](https://en.wikipedia.org/wiki/Continuous_integration) for R packages. [Travis CI](https://travis-ci.org/) is a popular continuous integration tools that supports Linux and OS X build environments. Travis has native R support, and can easily provide code coverage information via [covr](http://cran.rstudio.com/web/packages/covr/index.html) to [Codecov.io](https://codecov.io/) or [Coveralls](https://coveralls.io/). [travis](https://github.com/ropenscilabs/travis) (not on CRAN) provides an API client for Travis. Use of other CI services, such as [Circle CI](https://circleci.com/) may require additional code and examples are available from [r-travis](https://github.com/craigcitro/r-travis) and/or [r-builder](https://github.com/metacran/r-builder). [circleci](https://github.com/cloudyr/circleci) (not on CRAN) provides an API client for Circle CI. [badgecreatr](http://cran.rstudio.com/web/packages/badgecreatr/index.html) ([GitHub](https://github.com/RMHogervorst/badgecreatr)) provides a convenient way of creating standardized badges (or \"shields\") for package READMEs.\n-   [WinBuilder](http://win-builder.r-project.org/) is a service intended for useRs who do not have Windows available for checking and building Windows binary packages. The package sources (after an `R CMD check`) can be uploaded via html form or passive ftp in binary mode; after checking/building a mail will be sent to the `Maintainer` with links to the package zip file and logs for download/inspection. [Appveyor](https://www.appveyor.com/) is a continuous integration service that offers a Windows build environment. [r-appveyor](https://github.com/krlmlr/r-appveyor) (not on CRAN) and [appveyor](https://github.com/cloudyr/appveyor) (not on CRAN) provide API clients for Appveyor.\n-   [Rocker](https://github.com/rocker-org/rocker) provides containers for use with [Docker](https://www.docker.com/). [harbor](https://github.com/wch/harbor) can be used to control docker containers on remote and local hosts and [dockertest](https://github.com/traitecoevo/dockertest) provides facilities for running tests on docker.\n-   Some packages, especially some that are no longer under active development, remain hosted on [Google Code](https://code.google.com/). This service is closed to new projects, however, and will shut down in January 2016.\n-   [drat](http://cran.rstudio.com/web/packages/drat/index.html) can be used to distribute pre-built packages via Github or another server. [craneur](https://github.com/ColinFay/craneur) (not on CRAN) provides another way of creating the same. [miniCRAN](http://cran.rstudio.com/web/packages/miniCRAN/index.html) can be used to create a subset of CRAN, for example for self-hosting of packages and their dependencies.\n-   CRAN does not provide package download statistics, but the RStudio CRAN mirror does. [packagetrackr](http://cran.rstudio.com/web/packages/packagetrackr/index.html) ([Source](http://gitlab.points-of-interest.cc/points-of-interest/packagetrackr)) facilitates downloading and analyzing those logs.\n\n### CRAN packages:\n\n-   [aoos](http://cran.rstudio.com/web/packages/aoos/index.html)\n-   [aprof](http://cran.rstudio.com/web/packages/aprof/index.html)\n-   [argparse](http://cran.rstudio.com/web/packages/argparse/index.html)\n-   [argparser](http://cran.rstudio.com/web/packages/argparser/index.html)\n-   [assertive](http://cran.rstudio.com/web/packages/assertive/index.html)\n-   [assertr](http://cran.rstudio.com/web/packages/assertr/index.html)\n-   [assertthat](http://cran.rstudio.com/web/packages/assertthat/index.html)\n-   [available](http://cran.rstudio.com/web/packages/available/index.html)\n-   [backports](http://cran.rstudio.com/web/packages/backports/index.html)\n-   [badgecreatr](http://cran.rstudio.com/web/packages/badgecreatr/index.html)\n-   [checkmate](http://cran.rstudio.com/web/packages/checkmate/index.html)\n-   [checkpoint](http://cran.rstudio.com/web/packages/checkpoint/index.html)\n-   [CodeDepends](http://cran.rstudio.com/web/packages/CodeDepends/index.html)\n-   [codetools](http://cran.rstudio.com/web/packages/codetools/index.html)\n-   [commandr](http://cran.rstudio.com/web/packages/commandr/index.html)\n-   [covr](http://cran.rstudio.com/web/packages/covr/index.html)\n-   [cranly](http://cran.rstudio.com/web/packages/cranly/index.html)\n-   [devtools](http://cran.rstudio.com/web/packages/devtools/index.html) (core)\n-   [docopt](http://cran.rstudio.com/web/packages/docopt/index.html)\n-   [documair](http://cran.rstudio.com/web/packages/documair/index.html)\n-   [drat](http://cran.rstudio.com/web/packages/drat/index.html)\n-   [ensurer](http://cran.rstudio.com/web/packages/ensurer/index.html)\n-   [fgui](http://cran.rstudio.com/web/packages/fgui/index.html)\n-   [formatR](http://cran.rstudio.com/web/packages/formatR/index.html)\n-   [FuncMap](http://cran.rstudio.com/web/packages/FuncMap/index.html)\n-   [functools](http://cran.rstudio.com/web/packages/functools/index.html)\n-   [futile.logger](http://cran.rstudio.com/web/packages/futile.logger/index.html)\n-   [GetoptLong](http://cran.rstudio.com/web/packages/GetoptLong/index.html)\n-   [getPass](http://cran.rstudio.com/web/packages/getPass/index.html)\n-   [git2r](http://cran.rstudio.com/web/packages/git2r/index.html)\n-   [gitlabr](http://cran.rstudio.com/web/packages/gitlabr/index.html)\n-   [GRANBase](http://cran.rstudio.com/web/packages/GRANBase/index.html)\n-   [gWidgets2](http://cran.rstudio.com/web/packages/gWidgets2/index.html)\n-   [helloJavaWorld](http://cran.rstudio.com/web/packages/helloJavaWorld/index.html)\n-   [htmlwidgets](http://cran.rstudio.com/web/packages/htmlwidgets/index.html)\n-   [hunspell](http://cran.rstudio.com/web/packages/hunspell/index.html)\n-   [import](http://cran.rstudio.com/web/packages/import/index.html)\n-   [inline](http://cran.rstudio.com/web/packages/inline/index.html)\n-   [inlinedocs](http://cran.rstudio.com/web/packages/inlinedocs/index.html)\n-   [js](http://cran.rstudio.com/web/packages/js/index.html)\n-   [knitr](http://cran.rstudio.com/web/packages/knitr/index.html) (core)\n-   [lambda.r](http://cran.rstudio.com/web/packages/lambda.r/index.html)\n-   [later](http://cran.rstudio.com/web/packages/later/index.html)\n-   [lazyData](http://cran.rstudio.com/web/packages/lazyData/index.html)\n-   [lintr](http://cran.rstudio.com/web/packages/lintr/index.html)\n-   [log4r](http://cran.rstudio.com/web/packages/log4r/index.html)\n-   [logging](http://cran.rstudio.com/web/packages/logging/index.html)\n-   [magrittr](http://cran.rstudio.com/web/packages/magrittr/index.html)\n-   [matlabr](http://cran.rstudio.com/web/packages/matlabr/index.html)\n-   [microbenchmark](http://cran.rstudio.com/web/packages/microbenchmark/index.html)\n-   [miniCRAN](http://cran.rstudio.com/web/packages/miniCRAN/index.html)\n-   [mockr](http://cran.rstudio.com/web/packages/mockr/index.html)\n-   [mvbutils](http://cran.rstudio.com/web/packages/mvbutils/index.html)\n-   [optigrab](http://cran.rstudio.com/web/packages/optigrab/index.html)\n-   [osi](http://cran.rstudio.com/web/packages/osi/index.html)\n-   [packagedocs](http://cran.rstudio.com/web/packages/packagedocs/index.html)\n-   [packagetrackr](http://cran.rstudio.com/web/packages/packagetrackr/index.html)\n-   [packrat](http://cran.rstudio.com/web/packages/packrat/index.html)\n-   [pacman](http://cran.rstudio.com/web/packages/pacman/index.html)\n-   [pipeR](http://cran.rstudio.com/web/packages/pipeR/index.html)\n-   [pkgconfig](http://cran.rstudio.com/web/packages/pkgconfig/index.html)\n-   [pkgdown](http://cran.rstudio.com/web/packages/pkgdown/index.html)\n-   [pkggraph](http://cran.rstudio.com/web/packages/pkggraph/index.html)\n-   [pkgKitten](http://cran.rstudio.com/web/packages/pkgKitten/index.html)\n-   [pkgmaker](http://cran.rstudio.com/web/packages/pkgmaker/index.html)\n-   [pkgnet](http://cran.rstudio.com/web/packages/pkgnet/index.html)\n-   [prof.tree](http://cran.rstudio.com/web/packages/prof.tree/index.html)\n-   [profmem](http://cran.rstudio.com/web/packages/profmem/index.html)\n-   [profr](http://cran.rstudio.com/web/packages/profr/index.html)\n-   [proftools](http://cran.rstudio.com/web/packages/proftools/index.html)\n-   [progress](http://cran.rstudio.com/web/packages/progress/index.html)\n-   [proto](http://cran.rstudio.com/web/packages/proto/index.html)\n-   [purrr](http://cran.rstudio.com/web/packages/purrr/index.html)\n-   [PythonInR](http://cran.rstudio.com/web/packages/PythonInR/index.html)\n-   [qtbase](http://cran.rstudio.com/web/packages/qtbase/index.html)\n-   [R.methodsS3](http://cran.rstudio.com/web/packages/R.methodsS3/index.html)\n-   [R.oo](http://cran.rstudio.com/web/packages/R.oo/index.html)\n-   [R6](http://cran.rstudio.com/web/packages/R6/index.html)\n-   [rbenchmark](http://cran.rstudio.com/web/packages/rbenchmark/index.html)\n-   [rcmdcheck](http://cran.rstudio.com/web/packages/rcmdcheck/index.html)\n-   [Rcpp](http://cran.rstudio.com/web/packages/Rcpp/index.html)\n-   [Rd2roxygen](http://cran.rstudio.com/web/packages/Rd2roxygen/index.html)\n-   [RDocumentation](http://cran.rstudio.com/web/packages/RDocumentation/index.html)\n-   [Rdpack](http://cran.rstudio.com/web/packages/Rdpack/index.html)\n-   [remotes](http://cran.rstudio.com/web/packages/remotes/index.html)\n-   [reticulate](http://cran.rstudio.com/web/packages/reticulate/index.html)\n-   [rGroovy](http://cran.rstudio.com/web/packages/rGroovy/index.html)\n-   [rhub](http://cran.rstudio.com/web/packages/rhub/index.html)\n-   [RInside](http://cran.rstudio.com/web/packages/RInside/index.html)\n-   [rJava](http://cran.rstudio.com/web/packages/rJava/index.html)\n-   [rJython](http://cran.rstudio.com/web/packages/rJython/index.html)\n-   [rlang](http://cran.rstudio.com/web/packages/rlang/index.html)\n-   [rollbar](http://cran.rstudio.com/web/packages/rollbar/index.html)\n-   [roxygen2](http://cran.rstudio.com/web/packages/roxygen2/index.html) (core)\n-   [rPython](http://cran.rstudio.com/web/packages/rPython/index.html)\n-   [rscala](http://cran.rstudio.com/web/packages/rscala/index.html)\n-   [RStata](http://cran.rstudio.com/web/packages/RStata/index.html)\n-   [rstudioapi](http://cran.rstudio.com/web/packages/rstudioapi/index.html)\n-   [rtype](http://cran.rstudio.com/web/packages/rtype/index.html)\n-   [RUnit](http://cran.rstudio.com/web/packages/RUnit/index.html)\n-   [runittotestthat](http://cran.rstudio.com/web/packages/runittotestthat/index.html)\n-   [semver](http://cran.rstudio.com/web/packages/semver/index.html)\n-   [shiny](http://cran.rstudio.com/web/packages/shiny/index.html)\n-   [skeletor](http://cran.rstudio.com/web/packages/skeletor/index.html)\n-   [sos](http://cran.rstudio.com/web/packages/sos/index.html)\n-   [svUnit](http://cran.rstudio.com/web/packages/svUnit/index.html)\n-   [sys](http://cran.rstudio.com/web/packages/sys/index.html)\n-   [tcltk2](http://cran.rstudio.com/web/packages/tcltk2/index.html)\n-   [testit](http://cran.rstudio.com/web/packages/testit/index.html)\n-   [testthat](http://cran.rstudio.com/web/packages/testthat/index.html)\n-   [unitizer](http://cran.rstudio.com/web/packages/unitizer/index.html)\n-   [V8](http://cran.rstudio.com/web/packages/V8/index.html)\n-   [vdiffr](http://cran.rstudio.com/web/packages/vdiffr/index.html)\n-   [withr](http://cran.rstudio.com/web/packages/withr/index.html)\n-   [XRJulia](http://cran.rstudio.com/web/packages/XRJulia/index.html)\n\n### Related links:\n\n-   [\\[Manual\\] \"Writing R Extension\" by R-core team](http://cran.r-project.org/doc/manuals/R-exts.html)\n-   [\\[Tutorial\\] \"Creating R Packages: A Tutorial\" by Friedrich Leisch](http://cran.r-project.org/doc/contrib/Leisch-CreatingPackages.pdf)\n-   [\\[Tutorial\\] \"Best practices for writing an API package\" by Hadley Wickham](http://cran.r-project.org/whttp://cran.rstudio.com/web/packages/httr/vignettes/api-packages.html)\n-   [\\[Webpage\\] \"CRAN Repository Policy\" lists rules for hosting packages on CRAN](http://cran.r-project.org/whttp://cran.rstudio.com/web/packages/policies.html)\n-   [\\[Webpage\\] Dirk Eddelbuettel provides a feed of CRAN policy changes](https://github.com/eddelbuettel/crp)\n-   [\\[Webpage\\] \"Developing R packages\" by Jeff Leek](https://github.com/jtleek/rpackages)\n-   [\\[Book\\] \"Software for Data Analysis\" by John Chambers](http://www.springer.com/mathematics/computational+science+%26+engineering/book/978-0-387-75935-7)\n-   [\\[Book\\] \"Advanced R\" by Hadley Wickham](http://adv-r.had.co.nz)\n-   [\\[Book\\] \"R packages\" by Hadley Wickham](http://r-pkgs.had.co.nz/)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fropensci-archive%2FPackageDevelopment","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fropensci-archive%2FPackageDevelopment","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fropensci-archive%2FPackageDevelopment/lists"}