From c56433075ff299ede739d9f594cb70b7f0f5b91b Mon Sep 17 00:00:00 2001 From: willingc Date: Sat, 30 Sep 2023 16:04:25 +0000 Subject: [PATCH] willingc published a site update --- 09-message-translations.md | 6 +++--- 404.html | 2 +- CoreDev.html | 2 +- DevTools.html | 2 +- Doc.html | 2 +- FindSource.html | 2 +- FixBug.html | 2 +- GetStart.html | 2 +- IssueTrack.html | 2 +- News.html | 2 +- ReportingBugs.html | 2 +- ReviewBugs.html | 2 +- TestRVer.html | 2 +- WhereToGetHelp.html | 2 +- acknowledgement.html | 2 +- index.html | 4 ++-- index.md | 2 +- introduction.html | 2 +- message-translations.html | 8 ++++---- rdevguide.epub | Bin 1398135 -> 1398159 bytes rdevguide.pdf | Bin 1475496 -> 1475306 bytes rdevguide.tex | 8 ++++---- search_index.json | 2 +- 23 files changed, 30 insertions(+), 30 deletions(-) diff --git a/09-message-translations.md b/09-message-translations.md index 372366d..c655972 100644 --- a/09-message-translations.md +++ b/09-message-translations.md @@ -233,7 +233,7 @@ software projects. Register an account on R's Weblate server, > *Note: To get started follow the detailed workflow and convention for > translation which is given here: -> * +> * **Step 2: Choose a Component and Language** @@ -312,14 +312,14 @@ text box. language it can give you an idea of how other translators have handled it, especially which parts are left verbatim. A detailed guide is given here : - [Conventions-for-translations#languages-and-contributions](https://github.com/r-devel/translations/wiki/Conventions-for-translations#languages-and-contributions){.uri} + [Conventions-for-translations#languages-and-contributions](https://contributor.r-project.org/translations/Conventions_for_Languages/#languages-and-contributions){.uri} Related links: ## Current status of translations in R - + ## Helpful references diff --git a/404.html b/404.html index 36448d9..eae2b89 100644 --- a/404.html +++ b/404.html @@ -23,7 +23,7 @@ - + diff --git a/CoreDev.html b/CoreDev.html index 9d37467..c622217 100644 --- a/CoreDev.html +++ b/CoreDev.html @@ -23,7 +23,7 @@ - + diff --git a/DevTools.html b/DevTools.html index a030400..642e690 100644 --- a/DevTools.html +++ b/DevTools.html @@ -23,7 +23,7 @@ - + diff --git a/Doc.html b/Doc.html index aca6e01..ac6eff3 100644 --- a/Doc.html +++ b/Doc.html @@ -23,7 +23,7 @@ - + diff --git a/FindSource.html b/FindSource.html index cd57e93..b4fabf8 100644 --- a/FindSource.html +++ b/FindSource.html @@ -23,7 +23,7 @@ - + diff --git a/FixBug.html b/FixBug.html index b3e353f..f15da72 100644 --- a/FixBug.html +++ b/FixBug.html @@ -23,7 +23,7 @@ - + diff --git a/GetStart.html b/GetStart.html index 86a5edd..2f7f24f 100644 --- a/GetStart.html +++ b/GetStart.html @@ -23,7 +23,7 @@ - + diff --git a/IssueTrack.html b/IssueTrack.html index a5ce0b6..149525b 100644 --- a/IssueTrack.html +++ b/IssueTrack.html @@ -23,7 +23,7 @@ - + diff --git a/News.html b/News.html index d60aa40..fdb4f7e 100644 --- a/News.html +++ b/News.html @@ -23,7 +23,7 @@ - + diff --git a/ReportingBugs.html b/ReportingBugs.html index 0b8522e..532a840 100644 --- a/ReportingBugs.html +++ b/ReportingBugs.html @@ -23,7 +23,7 @@ - + diff --git a/ReviewBugs.html b/ReviewBugs.html index 968c1b9..415c433 100644 --- a/ReviewBugs.html +++ b/ReviewBugs.html @@ -23,7 +23,7 @@ - + diff --git a/TestRVer.html b/TestRVer.html index 67d580f..d40780e 100644 --- a/TestRVer.html +++ b/TestRVer.html @@ -23,7 +23,7 @@ - + diff --git a/WhereToGetHelp.html b/WhereToGetHelp.html index 6685092..6605f92 100644 --- a/WhereToGetHelp.html +++ b/WhereToGetHelp.html @@ -23,7 +23,7 @@ - + diff --git a/acknowledgement.html b/acknowledgement.html index 6992dba..7b26493 100644 --- a/acknowledgement.html +++ b/acknowledgement.html @@ -23,7 +23,7 @@ - + diff --git a/index.html b/index.html index bacf4c7..f587563 100644 --- a/index.html +++ b/index.html @@ -23,7 +23,7 @@ - + @@ -314,7 +314,7 @@

diff --git a/index.md b/index.md index 28b59eb..1605e5f 100644 --- a/index.md +++ b/index.md @@ -1,7 +1,7 @@ --- title: "R Development Guide" author: "R Contribution Working Group" -date: "2023-09-14" +date: "2023-09-30" site: bookdown::bookdown_site output: bookdown::gitbook documentclass: book diff --git a/introduction.html b/introduction.html index 7f11640..42d1848 100644 --- a/introduction.html +++ b/introduction.html @@ -23,7 +23,7 @@ - + diff --git a/message-translations.html b/message-translations.html index c88748c..118cab7 100644 --- a/message-translations.html +++ b/message-translations.html @@ -23,7 +23,7 @@ - + @@ -500,7 +500,7 @@

9.2 How to contribute new transla

Note: To get started follow the detailed workflow and convention for translation which is given here: -https://github.com/r-devel/translations/wiki/Conventions-for-translations

+https://contributor.r-project.org/translations/

Step 2: Choose a Component and Language

Select a component of R with less than 100% translation. Each component @@ -561,14 +561,14 @@

9.2 How to contribute new transla language it can give you an idea of how other translators have handled it, especially which parts are left verbatim. A detailed guide is given here : -Conventions-for-translations#languages-and-contributions

+Conventions-for-translations#languages-and-contributions

Related links: https://contributor.r-project.org/tutorials/translating-r-to-your-language/

9.4 Helpful references

diff --git a/rdevguide.epub b/rdevguide.epub index 1678a54ce290097aaabe302341f2fa255a885911..38c7a417920feb8fc0ddab532159a7c61c1a0c41 100644 GIT binary patch delta 13363 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 F{|`#SE~@|l diff --git a/rdevguide.pdf b/rdevguide.pdf index c770e9ce8b6609afb497dcb974ec1cfb93dd2246..5c871a30465ca300ec662011e90166f78339d2c6 100644 GIT binary patch delta 31224 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 diff --git a/rdevguide.tex b/rdevguide.tex index 0618717..91525fa 100644 --- a/rdevguide.tex +++ b/rdevguide.tex @@ -117,7 +117,7 @@ \title{R Development Guide} \author{R Contribution Working Group} -\date{2023-09-14} +\date{2023-09-30} \begin{document} \maketitle @@ -1772,7 +1772,7 @@ \section{How to contribute new translations}\label{how-to-contribute-new-transla \begin{quote} \emph{Note: To get started follow the detailed workflow and convention for translation which is given here: -\url{https://github.com/r-devel/translations/wiki/Conventions-for-translations}} +\url{https://contributor.r-project.org/translations/}} \end{quote} \textbf{Step 2: Choose a Component and Language} @@ -1855,7 +1855,7 @@ \section{How to contribute new translations}\label{how-to-contribute-new-transla language it can give you an idea of how other translators have handled it, especially which parts are left verbatim. A detailed guide is given here : - \href{https://github.com/r-devel/translations/wiki/Conventions-for-translations\#languages-and-contributions}{Conventions-for-translations\#languages-and-contributions} + \href{https://contributor.r-project.org/translations/Conventions_for_Languages/\#languages-and-contributions}{Conventions-for-translations\#languages-and-contributions} \end{itemize} Related links: @@ -1864,7 +1864,7 @@ \section{How to contribute new translations}\label{how-to-contribute-new-transla \hypertarget{current-status-of-translations-in-r}{% \section{Current status of translations in R}\label{current-status-of-translations-in-r}} -\url{https://contributor.r-project.org/translations/} +\url{https://contributor.r-project.org/translations-dashboard/} \hypertarget{helpful-references}{% \section{Helpful references}\label{helpful-references}} diff --git a/search_index.json b/search_index.json index aecd86c..be53f93 100644 --- a/search_index.json +++ b/search_index.json @@ -1 +1 @@ -[["index.html", "R Development Guide ", " R Development Guide R Contribution Working Group 2023-09-14 R Logo "],["acknowledgement.html", "Acknowledgement", " Acknowledgement This guide draws on documentation and articles written by the R Core Team. The first version of the guide was heavily influenced by the Python Developer’s Guide. Initial chapters of the guide were developed by Saranjeet Kaur Bhogal, in a project funded by the R Foundation, mentored by Heather Turner and Michael Lawrence. This initial version was upgraded in a Google Season of Docs 2022 project with Saranjeet Kaur Bhogal and Lluís Revilla Sancho working as technical writers managed by Nicolas Bennett and overseen by a Steering Committee including representatives from R Core and the wider R community. This guide has benefited and continues to benefit from varied contributions by several contributors. This project is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0). Some pages may contain materials that are subject to copyright, in which case you will see the copyright notice. "],["introduction.html", "Chapter 1 Introduction 1.1 Overview of different ways of contributing to the base R Project 1.2 Quick start to the guide 1.3 How to contribute to this guide itself?", " Chapter 1 Introduction This guide is a comprehensive resource for contributing to base R1 – for both new and experienced contributors. It is maintained by the R Contribution Working Group. We welcome your contributions to base R! 1.1 Overview of different ways of contributing to the base R Project Contributions to base R are possible in a number of different ways. Some of them are listed below: Contributing to bug fixing: Refer Bug Tracking and Reviewing Bugs. Contributing to translations: Refer Translations. Testing R before release: Refer Testing Pre-release R Versions. 1.2 Quick start to the guide The guide is intended as a comprehensive resource for contributing to base R. The following chapter outline provides an overview with links to sections for getting started with contributing. The Getting Started covers the instructions on how to install R on the major operating systems (Windows, Linux and macOS), as well as the tools required to build R and R packages from source. The Bug Tracking and the Reviewing Bugs chapters discuss how to find bugs in R and how to review bug reports that are submitted to Bugzilla. The Finding the Source chapter provides an overview of the R codebase and helps with finding source code of base functions written in R and/or C. The Lifecycle of a Patch chapter discusses how to create a patch to propose a bug fix. The Documenting R chapter describes the format and style guide for help files in R, how to report and review issues in the existing documentation and how to propose changes. How to test pre-release versions of R is discussed in the chapter on Testing Pre-release R Versions. The R Core Developers chapter contains a list of the former and current members of the R Core team who have write access to the R source. For more information on how to engage with to community and ask for help, refer to the Where to Get Help chapter. To keep up with the developments in R refer to some of the resources available in the News and Announcements Resources and tools that may be relevant for R developers are available in the Developer Tools chapter. 1.3 How to contribute to this guide itself? This guide is built using bookdown which makes editing it easier, provided you have a GitHub account (sign-up at github.com). After you log-in to GitHub, click on the ‘Edit’ icon highlighted with a red ellipse in the image below. This will take you to an editable version of the the source R Markdown file that generated the page you are on: Screenshot of the toolbar in the HTML version of the guide, with the Edit button (pencil and paper icon) circled in red. Use the issue tracker to raise an issue about the guide’s content or to make a feature request. Maintainers and contributors are requested to follow this project’s code of conduct. The set of packages in the base R distribution that are maintained by the R Core Team.↩︎ "],["GetStart.html", "Chapter 2 R Patched and Development Versions 2.1 The R source code 2.2 Prerequisites 2.3 Building R 2.4 See also", " Chapter 2 R Patched and Development Versions These instructions cover how to install R from source or from binaries. Contributors will typically need to work with the patched or development versions of R. This chapter describes where the source code for these versions can be found and how to install these versions from the source or the binary builds (where available). The tools required to build R and R packages are also discussed. For the most up to date and complete instructions you can check the R installation and administration manual . 2.1 The R source code R uses svn as a version control tool hosted at https://svn.r-project.org/R/ and uses a ‘major.minor.patchlevel’ version numbering scheme2. There are three releases of R available to install: The latest official release (r-release), either major version x.0.0 or minor version x.y.0, for example: 3.0.0 or 3.2.0 The patched release (r-patched), for example 3.0.1 or 3.2.1 and The development release (r-devel) : continually developed version moving from r-release to next major/minor version (x + 1).0.0 or x.(y + 1).0 a few weeks before release (at the start of the “GRAND FEATURE FREEZE”). The source code of released versions of R can be found at R/tags, the patched versions are at R/branch. The r-devel at R/trunk is the next minor or eventual major release development version of R. Bug fixes and new features are introduced in r-devel first. If the change meets the development guidelines R Core will also make the change in r-patched. 2.2 Prerequisites To install from the source code you will need the source code and the dependencies of R. If you need to install svn you can use your distribution’s package manager to install it. 2.2.1 Ubuntu In Ubuntu you can use this command to find all the dependencies of R: apt-rdepends --build-depends --follow=DEPENDS r-base-dev | grep " B" | sed -e "s/ Build-Depends: //" It might require installation of apt-rdepends which can be done from default repositories via sudo apt-get install apt-rdepends. To install all the R dependencies you can use: sudo apt-get build-dep r-base-dev 2.2.2 Fedora In Fedora you can use this command to find all the dependencies of R: dnf rq -q --repo=fedora-source --requires R You will also need the rsync package to download the recommended packages. To install them you can use: dnf install 'dnf-command(builddep)' dnf install rsync dnf builddep R 2.3 Building R 2.3.1 Linux Here are the basic steps intended as a checklist. For complete instructions please see the section in R-admin. Retrieve R source code via into TOP_SRCDIR, note that we retrieve the r-devel source code: export TOP_SRCDIR="$HOME/Downloads/R" svn checkout https://svn.r-project.org/R/trunk/ "$TOP_SRCDIR" Download the latest recommended packages3: "$TOP_SRCDIR/tools/rsync-recommended" Create the build directory in the BUILDDIR: export BUILDDIR="$HOME/bin/R" mkdir -p "$BUILDDIR" cd "$BUILDDIR" Configure the R installation (with --enable-R-shlib so that RStudio IDE can use it): "$TOP_SRCDIR/configure" --enable-R-shlib Build R : make Check that R works as expected: make check There are other checks you can run: make check-devel make check-recommended If we don’t want to build R in a different directory than the source code we can simply use: cd "$TOP_SRCDIR" svn update tools/rsync-recommended "$TOP_SRCDIR/configure" --enable-R-shlib make make check Once you successfully built R from source you can modify the R source code to fix an issue: Prepare a patch (See this guide) and after checking that R works as intended (make check-devel) submit the patch for consideration by R Core. (See the lifecycle of a patch chapter). To use the r-devel version in RStudio, you can do the following: export RSTUDIO_WHICH_R="$BUILDDIR/bin/R" cd "$TOP_SRCDIR" rstudio 2.3.2 Windows 2.3.2.1 Binaries The binary builds of R for Windows can be downloaded and installed from here. Along with the link to the latest stable release, this page also contains links to the binary builds of r-patched and r-devel. Click on the download links to download an executable installer. Select the language while installing, read the GNU general public license information, and select the destination location to start the installation. You will be prompted to select components at this stage: User installation, 64-bit User installation, or Custom installation. The default option may be chosen for the questions from this step onwards to complete the installation. Daily binaries for r-devel are made available for download and installation. 2.3.2.2 From source Before installing R from source, some additional programs are needed, as per the latest documentation: Rtools is the suggested toolchain bundle for building R base and R packages containing compiled code on Windows. The latest version of Rtools can be installed using the Rtools installer rtools43-XXXX-XXX.exe. A LaTeX compiler is needed to install and build R, check packages and build manuals. On CRAN, MiKTeX is used, which can be downloaded from https://miktex.org. Once installed open MiKTeX via the Windows start menu. It might ask to check for updates and more importantly, to make it available in PATH. You can accept both. Open the Rtools43 terminal to update and install subversion: pacman -Syuu pacman -Sy wget subversion Retrieve the latest source code via subversion: export TOP_SRCDIR="$HOME/Downloads/R" svn checkout https://svn.r-project.org/R/trunk/ "$TOP_SRCDIR" If you already have the repository available you can update as: cd $TOP_SRCDIR svn update You can also use a SVN client such as TortoiseSVN (https://tortoisesvn.net/, command line tool, and Windows Explorer integration) or SlikSVN (https://sliksvn.com/download/, just the command line tool) so that it can be also found by other tools. Download the latest tcl/tk and unzip it in $TOP_SRCDIR: cd "$TOP_SRCDIR" wget -np -nd -r -l1 -A 'tcltk-*.zip' https://cran.r-project.org/bin/windows/Rtools/rtools43/files/ unzip "tcltk-*.zip" Add gcc, MiKTeX and tar to the PATH and set one tar option: export PATH="/x86_64-w64-mingw32.static.posix/bin:$PATH" export PATH="/c/Program Files/MiKTeX/miktex/bin/x64:$PATH" export TAR="/usr/bin/tar" export TAR_OPTIONS="--force-local" If MiKTeX was installed just for your user you might need to run: export PATH="/c/Users/$USER/AppData/Local/Programs/MiKTeX/miktex/bin/x64:$PATH" Check that all the programs can be found: which make gcc pdflatex tar If there is any error you’ll need to find where the program is installed and add the corresponding path. Download the latest recommended packages4: cd "$TOP_SRCDIR/src/gnuwin32/" "$TOP_SRCDIR/tools/rsync-recommended" Build R and the recommended packages: make all recommended The recently compiled version of R will be at $TOP_SRCDIR/bin/. In RStudio you can select that folder and restart it to use the r-devel version. Check that R works as expected: make check There are other checks you can run for testing the successful installation of the recommended packages: make check-devel make check-recommended 2.3.3 macOS This section will be added after the official installation instructions for macOS in the R installation and administration manual have been updated for R 4.3.0. 2.4 See also CRAN official website R installation and administration manual R for macOS Tools for R in macOS R for requirements in macOS R for Windows FAQ RTools toolchains for Windows R FAQ Also known as semantic versioning↩︎ Recommended packages are not in the subversion repository.↩︎ Recommended packages are not in the subversion repository.↩︎ "],["IssueTrack.html", "Chapter 3 Issue Tracking 3.1 How to contribute to issue tracking? 3.2 How to get a Bugzilla account?", " Chapter 3 Issue Tracking Base R uses Bugzilla for issue tracking and reporting bugs. 3.1 How to contribute to issue tracking? Contributors can support issue tracking in R by Reporting bugs or making feature requests (bug reports filed under the “Wishlist” component in Bugzilla), Reviewing bug reports to help close reports where no fix is needed or to help narrow down the problem and identify what needs to be fixed, or Proposing changes to code or documentation that will close an issue. 3.2 How to get a Bugzilla account? Anyone can browse the bug reports on Bugzilla, but you will need an account to file a bug report, to comment on an existing bug report, or to submit a proposed fix in the form of patch file. To get a Bugzilla account send an e-mail to bug-report-request@r-project.org from the address you want to use as your Bugzilla login. Briefly explain why you want a Bugzilla account and a volunteer will add you to R’s Bugzilla members. After having successfully logged in to Bugzilla, you are good to go. 3.2.1 Navigating Bugzilla An image of the existing home page of Bugzilla is shared below: Screenshot of the existing home page of Bugzilla. On the home page of Bugzilla, there are various buttons and links. There are four square buttons called as: Screenshot of the four square buttons on the home page of Bugzilla. File a bug: You will have to log in to Bugzilla to file a bug using this button Search: When you click this button you will get a page with ‘Simple Search’ and ‘Advanced Search’ options. Either of the search options could be used depending on what you are looking for. Log In: Provide the appropriate email address and password here to log in to Bugzilla. Documentation: Provides a user guide for R's Bugzilla. Several useful shortcuts are available from the landing page: Enter a new bug report Show open bugs new-to-old Search existing bug reports A quick search bar is available on the home page where you can enter a bug number to search or some search terms. Screenshot of the quick search bar on the home page of Bugzilla. There is also a section for Common Queries on the home page which includes links to bugs reported and changed in the last 24 hours and last 7 days. Screenshot of the Common Queries section on the home page of Bugzilla. "],["ReportingBugs.html", "Chapter 4 Reporting Bugs 4.1 What is a bug in R? 4.2 What condition might not be a bug? 4.3 Checking if a bug is already reported 4.4 What are some places where you may find a bug? 4.5 How to report a bug? 4.6 Good practices in reporting bugs / Expectations of a good bug report 4.7 Disagreement with a resolution on the bug tracker 4.8 Examples of Bug reports submitted on Bugzilla or R-devel mailing list 4.9 See also", " Chapter 4 Reporting Bugs 4.1 What is a bug in R? You may find a bug in R if: The R session terminates unexpectedly, or there is a segmentation fault, it might be a bug in R, unless you have written your own call to compiled code or an internal function (via .C or .Internal). The error may look like this: ## *** caught segfault *** ## address (nil), cause 'memory not mapped' If the code does not do what the documentation says it should, then either the code or the documentation is wrong. Report either of which needs to be fixed. Note: When you are in doubt that there is a bug: (which should be the case most of the time!) Make sure whether the bug appears in a clean session of R. Many times, there are variables/commands/functions stored in the workspace which might cause issues. Hence, check if the issue happens in a clean session. To do so, launch R from the command line with the --vanilla option. At times the code that is written is very complicated, has numerous package and file dependencies, has many function calls, etc.. In such scenarios it is quite common that the code throws an error and you are not able to solve it. You may tend to think that there is a bug that needs to be reported. Before doing so, try to produce a minimum working example of the code for the section where the error occurred. Add only those packages and files which are required by that section, and see if the error still appears. Using this approach shall solve most of the errors. Install R-devel, which is the most recent version of R from svn / git or daily Windows build, and see if your bug still exists in R-devel (it may have been fixed very recently). Search on the R-devel mailing list for messages with keywords related to your possible bug. If you find some related messages then read them to see if they clarify whether or not it is a bug. If you do not find any related messages, then please post a new message to R-devel. Your message should include (1) a brief description of the bug including current and expected behavior, (2) a minimal reproducible example. 4.2 What condition might not be a bug? In case the code is doing something unexpected, it may not necessarily be a bug. Carefully review the documentation of the function being called, and check whether the behaviour being exhibited on calling this function is the same as it was designed to do. Issues with seemingly identical numbers not being equal (especially floating point numbers) are usually not bugs. If R is running slower than expected, then this also may not be a bug. Ask someone else to review your code in such a case. If some function is working, but it is not defined in the best generalised way, then consult someone to look over the code. This may perhaps not be a bug; instead, it might be an alternative way of writing the function. 4.3 Checking if a bug is already reported The first step before filing a bug report is to see whether the problem has already been reported. Checking if the bug is reported will: Save time for you and the developers. Help you see if the bug is already fixed for the next release. Lead you to learn what needs to be done to fix it. Determine if any additional information is needed. The sections that follow discuss where to check whether a bug is already reported. 4.4 What are some places where you may find a bug? You may find a bug in: In the R-Core supported packages, their documentations, and/ or in the R language implementation. In packages and/or their documentations which are not supported by the R-Core. 4.5 How to report a bug? Once you confirm a bug exists, you need to submit a bug report so that it gets fixed. 4.5.1 Bug in the R-Core supported packages, their documentations, and/ or in the R language Packages that are supported by the R-Core are labelled with Maintainer: R Core Team <R-core@r-project.org>. One simple way to get the information from R is by running the maintainer(\"package_name\") command. The bug report for R-Core supported packages, their documentations, and/ or a bug report for the R language itself can be submitted either to R-devel, see posting guide, or to Bugzilla. In the future, we hope to have an option to report an issue to the GitHub Mirror of the R svn server. In order to report bugs, as well as fixes, using Bugzilla, please ensure that you have a Bugzilla account Please ensure whether the bug is already fixed (in the upcoming changes in R) or reported (search for it from those already reported on Bugzilla, either on search existing bug reports, using the advanced search option here, or show open bugs new-to-old). 4.5.2 Bug in the non R-Core supported packages and/or their documentations For packages that are not maintained by the R-Core, the bug reports can be submitted at, perhaps, an issues tracker url on GitHub/GitLab/R-Forge. To find if such an issues tracker is available, you can look at the package DESCRIPTION file first (e.g. using packageDescription(\"package_name\")) to check if a url is provided in the BugReports field. If that is not available, then the package maintainer can be contacted (using maintainer(\"package_name\")). In R running the function bug.report(package = \"package_name\") shall direct you to either the GitHub issue tracker of the package, or to the bug tracking web page, or towards composing an e-mail to the package maintainer. This function bug.report is disabled in RStudio, by default. However, if you use utils::bug.report(package = \"package_name\") then it works on RStudio as well. Please ensure that the bug is not already reported or fixed before reporting it in any of the ways suggested above. 4.6 Good practices in reporting bugs / Expectations of a good bug report If you follow the practices given below, you will come up with a good bug report which might make it easier for the maintainer(s) to fix the bug. Include a minimal reproducible example of the bug in your report. The maintainer should be able to quickly reproduce the bug using the minimal example that you provide. Here is a community wiki post on how to make a minimal reproducible example. Mention the software architecture on which the bug occurred. Use inbuilt data sets as far as possible. In addition to the above, here are the bug writing guidelines on Bugzilla. The bug reporting documentation in R also discusses practices to write a good bug report. Once you have successfully reported a bug, you will likely receive an update each time an action is taken on the bug. On Bugzilla, the report may be given one of the following status: New, Assigned, Confirmed, Reopened, Unconfirmed. 4.7 Disagreement with a resolution on the bug tracker As humans, there might be differences of opinions from time to time. What needs to be considered here is to be respectful of the fact that care, thought, and volunteer time has gone into the resolution of the issue or bug. If you take some time, then on reflection, the resolution steps may seem more reasonable than you initially thought. If you still feel that the resolution is incorrect, then raise a thoughtful question to the person who resolved it. If the issue was not carefully thought about in the first place then it is less likely to win any conversion of thought. As a reminder, issues closed by a core developer on Bugzilla have already been carefully considered. Please do not reopen a closed issue. Although one can comment on a closed issue, if necessary. Every comment on an issue generates an email to every R-core member (unless they have the notifications disabled). So it would be best to be considerate while commenting on issues, especially in case of closed issues or when you are commenting in pure agreement without adding anything beyond that to a discussion (the +1 type posts which are perfectly acceptable in other contexts). 4.8 Examples of Bug reports submitted on Bugzilla or R-devel mailing list If you like to see how bugs are reported on Bugzilla, here are some examples: Bug 17767 - Warning about incomplete argument within nlme: A bug report with a reproducible example, a patch, and a review. Possible bug when finding shared libraries during staged installation: A bug report submitted by Kara Woo which was promptly fixed via the R-devel mailing list. (More information about the R-devel mailing list can be found here). Bug: time complexity of substring is quadratic as string size and number of substrings increases: A substring reported by Toby Dylan Hocking and fixed by Tomas Kalibera, Feb 2019 via the R-devel mailing list. patch for gregexpr(perl=TRUE): A gregexpr bug report and patch submitted by Toby Dylan Hocking and merged by Tomas Kalibera, Feb 2019 via the R-devel mailing list. 4.9 See also Reporting a bug R FAQ on bugs Bugzilla guidelines of reporting a bug "],["ReviewBugs.html", "Chapter 5 Reviewing Bugs 5.1 How you can help to review bug reports? 5.2 Classifying bug reports 5.3 How to find a bug report or an issue to review? 5.4 Example of a bug review submitted on Bugzilla 5.5 See also", " Chapter 5 Reviewing Bugs 5.1 How you can help to review bug reports? After understanding where bugs are reported in R (Bugzilla) or in other projects (GitHub/GitLab/R-Forge), a great way to contribute is reviewing bug reports. Around the clock, new bug reports are being submitted on Bugzilla or the bug trackers (for instance, GitHub issues) of R packages and existing bug reports are being updated. Every bug report needs to be reviewed to make sure various things are in proper order. You can help with this process of reviewing bugs. 5.1.1 Preparing to review bug reports If you want to review bug reports on Bugzilla, you are required to have a Bugzilla account. More details on how you can review a bug report are available on this post on the R Blog: R Can Use Your Help: Reviewing Bug Reports 5.2 Classifying bug reports A good bug report is the one which: Explains clearly how to reproduce the bug. Includes the version of R, the machine architecture, and the operating system platform on which the bug occurred. Relevant details should be a part of a good bug report. You can help with the following tasks once you have some R programming experience: Reproducing the bug: If you see a bug report which does not clearly explain how to reproduce it, you can try reproducing the bug and eventually make things easier for the core developer(s) and/or package maintainer(s). Checking different binary builds: Check whether the bug occurs on a different binary build of R. It is helpful to know whether the bug is affecting: r-patched, r-devel, or r-release binary builds of R. Writing a unit test: If the bug report lacks a unit test that should be a part of R’s test suite, then you can help with providing it. These helpful tasks allow the Core developers and/ or maintainers to classify a bug report properly, so that the bug can be handled in a timely fashion. 5.3 How to find a bug report or an issue to review? You may search old bug reports or issues that could be closed. Old bug reports may no longer be valid or may include a patch that is ready to be committed, but no one has had the time to review and commit. You might also want to search for issues in topics in which you have a working knowledge. When on Bugzilla you can use the advanced search to find specific topics. Bug reports are by default public on Bugzilla (unless the defaults are changed to avoid security vulnerability). 5.4 Example of a bug review submitted on Bugzilla If you would like to see how bugs are reviewed on Bugzilla, the Bug 16542 - nlme:::summary.lmList with unequal outputs per group is an example where an old bug report is being reviewed. It is tested to see if it was still an issue and a few ways are proposed to resolve the issue. Note: There is a #bug-reporting channel on the R Contributors slack where you can share your bug report(s) for review/feedback before submitting to Bugzilla. This can help with checking that it really is a bug, that you have included the important information and excluded redundant information. 5.5 See also Reviewing bug reports: Blog "],["FindSource.html", "Chapter 6 Finding the Source 6.1 Finding R source code 6.2 Finding C source code 6.3 See also", " Chapter 6 Finding the Source This chapter discusses how you can have an overview of the R codebase. For instance, where to find the implementation of a base function written in R and where to find a primitive implementation written in C. You may want to find the source code of a function just out of curiosity or maybe to gain more insight into what a particular function is actually doing. Whatever be the case, reading the source code will help you to learn a lot about any function. 6.1 Finding R source code Find the R function with the code of interest. You will always be able to print the top-level function (or use View(function_name) in RStudio). Looking at the code for the body of this function will reveal what you need to do next: Can already see code of interest: stop here or skip to step 3 to find the corresponding file in the R sources. Code of interest is in nested R function: go to step 2. Top-level function is an S3 generic, identified by a call to UseMethod(). Use methods(function_name) to see available methods, then go to step 2. Code of interest is in compiled code, identified by a call to .C(), .Call(), .Fortran(), and .External(), or .Internal() and .Primitive(): go to section on compiled code. Nested functions or S3 methods may not be exported by the package they are in. If this is the case, the simplest way to view the code is to use getAnywhere() or getS3method(). Now you can keep looking at nested R functions till you find the code of interest or hit a call to compiled code. Find an R function in the R sources. Two options here: Search on the internet: For R Core packages, search on the GitHub mirror (https://github.com/r-devel/r-svn); for recommended packages, use the CRAN mirror (https://github.com/cran) - this will link to the source on GitHub if available, e.g. https://github.com/cran/survival. Note that GitHub search ignores wildcard characters . , : ; / \\ ` ' " = * ! ? # $ & + ^ | ~ < > ( ) { } [ ] but this does not include - so you can search for a function or S3 method as follows: "body <- function" extension:R "quantile.ecdf <- function" extension:R Search in the R sources using grep: The Getting Started chapter discusses how to download the R sources directly or from the svn repository. Now if the sources are in ~/R-devel, you can search as follows: grep -R "body <- function" ~/R-devel/src grep -R "quantile <- function" ~/R-devel/src/library Note: The above procedure does not cover S4, R6 or RC generics or methods. Refer accessing R source for further details. 6.2 Finding C source code If .Internal() or .Primitive(), find entry point in names.c as described in the Jenny Bryan’s post of accessing R source. For all other calls to compiled code, you can find the entry point from within R. For instance, the body of complete.cases() is .External(C_compcases, ...) C_compcases inherits from class “NativeSymbolInfo” and we can extract the name of the entry point via stats:::C_compcases$name We know that it is in the stats package as we see that when we print complete.cases or look at the help file. This shows us that the entry point is simply “compcases” and in fact that is the general convention in R code, that you simply remove the C_ prefix (sometimes .F_ for Fortran code) in the name of the object passed to the first argument of the call. Once you have the entry point, search as for R code. In the case of searching on GitHub, restrict the search to files with the relevant extension compcases path:*.c lowesw path:*.f similarly for grep grep -R --include=*.c "compcases" ~/R-devel/src/library/ Note: Many editors (like RStudio, ESS) support ctags for code browsing, making it easy to jump to definitions of functions. R CMD rtags can generate ctags for any R code (Credit: Deepayan Sarkar). A more sophisticated system is called GNU GLOBAL, which also supports finding all references (calls) to a function. GitHub has a code navigation feature via the library tree-sitter. Unfortunately, it does not have R support yet. An R driver for tree-sitter made by Jim Hester is available. 6.3 See also Read the R source blogpost. "],["FixBug.html", "Chapter 7 Lifecycle of a Patch 7.1 Introduction 7.2 When do you submit a patch? 7.3 What tools are required to submit a patch? 7.4 How to prepare a patch? 7.5 Making good patches 7.6 Submitting your patch for review 7.7 Getting your patch reviewed 7.8 Leaving a patch review on Bugzilla 7.9 Dismissing review from another core developer 7.10 Acceptance or rejection of your patch 7.11 Examples of patch reports on Bugzilla 7.12 Examples of reviewing a patch 7.13 See also", " Chapter 7 Lifecycle of a Patch 7.1 Introduction R uses a workflow based on patches. A patch is the set of differences (additions and deletions) between two versions of code. So you can create a patch defining a bug fix or a proposed update to the R codebase and submit it through your official Bugzilla account to the core developer(s). Be clear in your communication as it is the key to contributing to any project, especially an open source project like R. 7.2 When do you submit a patch? There might be a situation where you come across a bug in R, which you may have an idea of how to fix. This can turn out to be an opportunity for you to submit a patch. By submitting a patch or a bug fix, you are helping to reduce the workload on the R developers in addition to yourself being a contributor to R! When you submit a patch, you are helping the developer(s) and maintainer(s) so that they do not have to write the entire code from scratch. Instead, they can test and tweak your patch, if necessary. 7.3 What tools are required to submit a patch? To submit a patch, you need: SVN installed on your machine. The latest developer version of R. You can retrieve the latest source code of R via: export TOP_SRCDIR="$HOME/Downloads/R" svn checkout https://svn.r-project.org/R/trunk/ "$TOP_SRCDIR" Depending on the operative system you might need to do some steps before that. The different steps required can be found in previous chapters of the book, for Windows, macOS and Linux. 7.4 How to prepare a patch? If you have the source code in $TOP_SRCDIR you can edit the files, for example a documentation file such as \"$TOP_SRCDIR\"/src/library/stats/man/Multinom.Rd, to make your desired changes to that or more files. Then you should check that R still works as expected via: cd "$TOP_SRCDIR" make check-devel If there is no test for your proposed change you can add a new regression test, following the guidelines. Then you should bring changes from the repository into the working copy, in case any other change has been introduced, and create a path.diff file with just the changes you want to propose to the R core: svn update svn diff > patch.diff This patch.diff file is the one that can be proposed to the R core via Bugzilla. You can also ask for reviews to the patch before proposing it to the R core via the r-devel mailing list or the slack channel of the R-contributors space. 7.4.1 Using a git mirror Besides checking in your computer, you can use the Github mirror r-devel/r-svn of the source code to check this patch with different configurations and OS. You should first find the file to edit, via the github interface for example: Screenshot of the heading of the src/library/stats/man/Mulinom.Rd Then you can edit it, directly in the interface or using the github interface: Screenshot of the file src/library/stats/man/Mulinom.Rd being edited via the Github interface Create a commit with a message describing the changes Screenshot of the commit message And create a pull request from the branch created to check the changes. Screenshot of the message when opening a pull requests from the branch Add a message and description of the svn for other users and the R core to know what is the purpose of this modification: Screenshot of the message and content while opening a pull requests for the r-svn repository Screenshot of the pull requests opened Once the PR is submitted, some automatic checks will be triggered (they might need to be approved by some other users as per Github rules): When the checks end you will need to explore the results and asses if the results indicate a problem or not. Screenshot of the results of the Github checks in the r-svn mirror Once you are happy with the changes and the checks report that everything is okay you can retrieve the patch via: https://patch-diff.githubusercontent.com/raw/r-devel/r-svn/pull/<pull_request_number>.diff With that file you can submit your patch, remember to check if it meets the recommendations for good patches. If you want to use git from the terminal to create the pull request (PR) to test the changes, you can use this summary of the available git commands. 7.5 Making good patches When creating a patch for submission, there are several things that you can do to help ensure that your patch is accepted: Make sure to follow R’s coding standards (R is a GNU project and there are GNU coding standards). The coding style of the patch you submit should largely match with the codebase it is being applied to. If your patch has one or two minor discrepancies, then those may be fixed by the core developer who will eventually test your patch. However, if there are systematic deviations from the style guides your patch will be put on hold until you fix the formatting issues. There is no comprehensive official R style manual, however some nearly universal standards are summarised in this article. Be aware of backwards-compatibility considerations. While the core developer who eventually handles your patch will make the final call on whether something is acceptable, thinking about backwards-compatibility early will help prevent having your patch rejected on these grounds. Put yourself in the shoes of someone whose code will be broken by the change(s) introduced by the patch. It is quite likely that any change made will break someone’s code, so you need to have a good reason to make a change as you will be forcing someone to update their code. This obviously does not apply to new functions or new arguments. New arguments should be optional and have default values which maintain the existing behaviour. If in doubt, discuss the issue with experienced developers. Make sure you have proper tests to verify that your patch works as expected. Patches may not be accepted without the proper tests. Make sure the entire test suite runs without failure because of your changes. It is not sufficient to only run whichever test seems impacted by your changes, because there might be interactions unknown to you between your changes and some other part of the interpreter. Proper documentation additions/changes should be included. Each bugfix should ideally be addressed by a single patch. In particular, do not fix more than one issue in the same patch (except, if one code change fixes all of them) and do not do cosmetic changes to unrelated code in the same patch as some bugfix. 7.6 Submitting your patch for review Patch in response to a pre-existing issue or bug report: In this case, you should attach the patch to the existing issue or bug report on Bugzilla with a brief comment. Patch in response to an unreported issue or bug report: Assuming you already performed a search on Bugzilla for a pre-existing issue or bug and did not find the issue or bug reported, you need to create a new bug report and include your patch with it. Please fill in as much relevant detail as possible to prevent reviewers from having to delay reviewing your patch because of lack of information. Include (mostly as the first sentence), a to-the-point explanation of what the purpose of the patch is. This sentence should not be in the descriptive form, rather an imperative form will be more suitable here. If this is not enough detail for a patch, a new paragraphs(s) can be added to explain in proper depth what has happened. The details should be good enough that a core developer reading it understands the justification for the change. 7.7 Getting your patch reviewed To begin with, please be patient. There are many more people submitting patches than there are people capable of reviewing your patches. Getting your patch reviewed requires a reviewer to have the spare time and motivation to look at your patch. We cannot force anyone to review patches and no one is employed to look at patches. There is a #patches-for-review channel on the R Contributors slack where you can share your patch(es) for review/feedback before submitting to R-Core/Bugzilla. This can help with checking that you have included the important information and excluded redundant information. If your patch has not received any notice from reviewers (i.e., no comment made) after one month, comment/message on the #patches-for-review channel to remind the members that the patch needs a review. When someone does manage to find the time to look at your patch they will most likely make comments about how it can be improved. It is then expected that you update your patch to address these comments, and the review process will thus iterate until a satisfactory solution has emerged. 7.7.1 How to review a patch? One of the bottlenecks in the R development process is the lack of code reviews. If you browse Bugzilla, you will see that numerous issues have a fix, but cannot be merged into the main source code repository, because no one has reviewed the proposed solution. Reviewing a patch can be just as informative as providing a patch and it will allow you to give constructive comments on another developer’s work. This guide provides a checklist for submitting a patch review. It is a common misconception that in order to be useful, a patch review has to be perfect. This is not the case at all. It is helpful to just test the patch and/or play around with the code and leave comments in the patch or on Bugzilla. If a bug report or an issue has a patch attached that has not been reviewed, you can help by making sure that the patch: follows the style guides; is a good solution to the problem it is trying to solve; includes proper tests; and includes proper documentation changes. Also refer to Making good patches for more ideas. Doing all of this allows the core developer(s) and/ or maintainer(s) to more quickly look for subtle issues that only people with extensive experience working on R’s codebase will notice. 7.8 Leaving a patch review on Bugzilla When you review a patch, you should provide additional details and context of your review process and leave comments. For example: If you tested the patch, report the result and the system and version tested on, such as ‘Windows 10’, ‘Ubuntu 16.4’, or ‘Mac High Sierra’. If you request changes, try to suggest how or attach an updated patch. Comment on what is ‘good’ about the patch, not just the ‘bad’. Doing so will make it easier for the patch author to find the good in your comments. 7.9 Dismissing review from another core developer A core developer can dismiss another core developer’s review if they confirmed that the requested changes have been made. When a core developer has assigned the patch to themselves, then it is a sign that they are actively looking after the patch, and their review should not be dismissed. 7.10 Acceptance or rejection of your patch Once your patch has reached an acceptable state, it will either be applied or rejected. If it is rejected, please do not take it personally. Your work is still appreciated regardless of whether your patch is applied. Balancing what does and does not go into R is tricky and everyone’s contributions cannot always be accepted. But if your patch is accepted and applied it will then go on to be released with the next patched release and eventually the next major release of R. It may also be backported to older versions of R as a bugfix if the core developer doing the patch acceptance believes it is warranted. It may take longer before your patch is accepted and applied or rejected, sometimes even months or years. Nonetheless, it is appreciated that you submitted a patch. 7.11 Examples of patch reports on Bugzilla 7.12 Examples of reviewing a patch 7.13 See also Submitting patches "],["Doc.html", "Chapter 8 Documenting 8.1 Guidelines for writing R help files 8.2 R manuals 8.3 Helping with documentation 8.4 Proofreading 8.5 Helping with the Developer’s Guide 8.6 Reporting documentation bugs 8.7 See also", " Chapter 8 Documenting R has a substantial body of documentation, comprising help files for the core packages and a set of manuals aimed at users (An Introduction to R, R Data Import/Export), system administrators (R Installation and Administration) and developers (Writing R Extensions, The R language definition, and R Internals). This documentation was developed by the R Core Team with input from external contributors. The continuing involvement of the user community is important in maintaining this valuable documentation. The involvement of the community takes many forms, from contributing content, to making bug reports or raising an issue when the documentation could be more complete or made easier to follow. This chapter is about the ways people can contribute to R’s documentation, with guidance on how to do that. Any time you feel that you can clarify or fill gaps in existing documentation, your contribution is welcome and appreciated. If you find it difficult to deal with the markup used in the source files, you can ask for help with that part too. Please do not let the material in this chapter stand between the documentation and your desire to help out. However, not every good faith effort to change or extend the documentation will be accepted - sometimes the suggested changes may be incorrect; other times, while a change in wording may make some things clearer and easier to understand, the finer details of some corner case may become less clear, leading to the suggested changes being declined or modified by a member of R Core before applying them (if they agree the issue is important enough to fix). 8.1 Guidelines for writing R help files The help files for R functions are written in ‘R documentation’ (.Rd) file format. It is a simple markup language with close resemblance to LaTeX. The .Rd file format can be further processed into a variety of formats, including LaTeX, HTML, and plain text. The .Rd files can be found in the man directory of the sources for the corresponding base package. For example, consider the mean.Rd file. % File src/library/base/man/mean.Rd % Part of the R package, https://www.R-project.org % Copyright 1995-2022 R Core Team % Distributed under GPL 2 or later \\name{mean} \\title{Arithmetic Mean} \\usage{ mean(x, \\dots) \\method{mean}{default}(x, trim = 0, na.rm = FALSE, \\dots) } \\alias{mean} \\alias{mean.default} \\arguments{ \\item{x}{An \\R object. Currently there are methods for numeric/logical vectors and \\link[=Dates]{date}, \\link{date-time} and \\link{time interval} objects. Complex vectors are allowed for \\code{trim = 0}, only.} \\item{trim}{the fraction (0 to 0.5) of observations to be trimmed from each end of \\code{x} before the mean is computed. Values of trim outside that range are taken as the nearest endpoint. } \\item{na.rm}{a logical evaluating to \\code{TRUE} or \\code{FALSE} indicating whether \\code{NA} values should be stripped before the computation proceeds.} \\item{\\dots}{further arguments passed to or from other methods.} } \\description{ Generic function for the (trimmed) arithmetic mean. } \\value{ If \\code{trim} is zero (the default), the arithmetic mean of the values in \\code{x} is computed, as a numeric or complex vector of length one. If \\code{x} is not logical (coerced to numeric), numeric (including integer) or complex, \\code{NA_real_} is returned, with a warning. If \\code{trim} is non-zero, a symmetrically trimmed mean is computed with a fraction of \\code{trim} observations deleted from each end before the mean is computed. } \\references{ Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) \\emph{The New S Language}. Wadsworth & Brooks/Cole. } \\seealso{ \\code{\\link{weighted.mean}}, \\code{\\link{mean.POSIXct}}, \\code{\\link{colMeans}} for row and column means. } \\examples{ x <- c(0:10, 50) xm <- mean(x) c(xm, mean(x, trim = 0.10)) } \\keyword{univar} Many authors of contributed R packages use the roxygen2 package to write documentation, which generates .Rd files from comments in the package .R files. However, the help files in the base distribution are maintained by directly editing the .Rd files. This section gives an overview of the .Rd format and summarises the guidelines for writing the R help files. The guidelines are intended for contributors to base R, but may also be useful for authors of contributed packages. Full documentation on writing R documentation files can be found in the Writing R Extensions manual. There are three main parts of an .Rd file: Header: This part is for the basic information of the document/file. For instance, the name of the file, the topics documented, a title, a short textual description, and R usage information for the objects documented. Body: This part includes further information on the function’s arguments and return value. Footer: This part is optional. Usually the keyword information is included here. All the above information is included in a .Rd file within a series of sections with standard names (user-defined sections are also allowed). These sections are discussed below: \\title section: Capitalize each word. Do not end in a period. Avoid use of markup language (because markup language need not be suitable for various hypertext search systems). \\usage and \\examples sections: Line length of 65 characters is advised. Use TRUE instead of T and FALSE instead of F. Add spaces around binary operators. Add spaces after commas in the argument lists. Use <- rather than = for assignments. Add spaces around the <- operator. Do not use tabs to indent (as these do not render correctly on all possible pagers). Use 4 spaces to indent the (example) code. Make sure the examples are directly executable. The examples should be system-independent. The examples should not require special facilities (for instance, Internet access or write permission to specific directories). Examples should also not take longer than necessary to run, as they are run when checking a build of R. \\source and \\references sections: Author(s) names should be written in the form Author, A. B.. Author(s) names should be separated by a comma or and (but not both). Separate paragraphs (separated by a blank line) should be used for each reference. Give a date immediately after the author(s) names. Do not put a period after the date. Titles of books and journals (not articles) should be enclosed in \\emph{...}. Volume numbers for journals are to be enclosed in \\bold{...} and followed by a comma. Use -- for page ranges. For giving an address for a publisher use the format New York: Springer-Verlag. The language used in the documentations should follow these basic rules: Affirmative tone should be used to describe what the function does and how to use it effectively. Rather than creating worry in the mind of a reader, it should establish confident knowledge about the effective use of the particular function/feature. More documentation is not necessarily better documentation. Long descriptions full of corner cases and caveats can create the impression that a function is more complex or harder to use than it actually is. Be succinct but exhaustive. Short code examples can help in understanding better. Readers can often grasp a simple example more quickly than they can digest a formal description. Usually people learn faster with concrete, motivating examples that match the context of a typical use case. Giving a code equivalent (or approximate equivalent) can be a useful addition to the description provided. You should carefully weigh whether the code equivalent adds value to the document. The tone of the documentation needs to be respectful of the reader’s background. Lay out the relevant information, show motivating use cases, provide glossary links, and do your best to connect-the-dots. The documentation is meant for newcomers, many of whom will be using it to evaluate the R language as a whole. The experience needs to be positive and not leave the reader with worries that something bad will happen if they make a mistake. Extensive details of writing R documentation files can be found here. 8.2 R manuals The R manuals are a part of the R sources. Hence, bug reports/patches can also be submitted via Bugzilla, e.g. Bug 15221 - R-admin/‘Installing R under Windows’: Missing argument name. Note that they are typically referred to by their file names as listed below: Manual Nickname An Introduction to R “R-intro” R Data Import/Export “R-data” R Installation and Administration “R-admin” Writing R Extensions “R-exts” The R language definition “R-lang” R Internals “R-ints” Note: Every manual is associated with a particular version of R, so you should check the version before reporting a bug. The R manuals page has links for the three types of release: r-release, r-patched and r-devel. These nicknames appear in the URLs, e.g. https://cran.r-project.org/doc/manuals/r-release/R-intro.html. The Texinfo manual should be referred to for how to mark up text. 8.3 Helping with documentation Maintaining the accuracy of R’s documentations and keeping a high level of quality takes a lot of effort. Community members, like you, help with writing, editing, and updating content, and these contributions are appreciated and welcomed. Looking at pre-existing documentation source files can be very helpful when getting started. You can directly search for documentation issues/bugs on Bugzilla. Issues vary from typos to unclear documentation and items lacking documentation. If you see a documentation issue that you would like to tackle, you can leave a comment on the issue saying you are going to try to solve the issue and mention roughly how long you think you will take to do so (this allows others to take on the issue if you happen to forget or lose interest). If you find some typo or problem on CRAN after checking the problem or typo you can write a polite email to cran-sysadmin@r-project.org and one of the R-core members working with CRAN. You’ll probably get a prompt reply about how the issue is going to be fixed. 8.4 Proofreading While an issue filed on Bugzilla means there is a known issue somewhere, that does not mean there are not other issues lurking about in the documentation. Proofreading a part of the documentation can often uncover problems. If you decide to proofread, read a section of the documentation from start to finish, filing issues in Bugzilla for each major type of problem you find. It is best to avoid filing a single issue for an entire section containing multiple problems; instead, file several issues so that it is easier to break the work up for multiple people and more efficient review. 8.5 Helping with the Developer’s Guide The Developer’s Guide (what you are reading now) uses the same process as the main R documentation, except for some small differences. The source lives in a GitHub repository and bug reports should be submitted to the devguide GitHub tracker. Our dev guide workflow uses continuous integration and deployment so changes to the dev guide are normally published when the pull request is merged. How to contribute to this guide from the introduction. 8.6 Reporting documentation bugs If you find some typo or problem on the CRAN webpages you can write a polite email to CRAN@r-project.org to report it. As an alternative, one can also write to the R-devel mailing list or submit a bug report via R’s Bugzilla. For improvements of the R-manuals or reporting typos or bugs in the R-manuals, submit a bug report to R’s Bugzilla. For reporting bugs or typos on the webpages or documentation about a particular package, write to the corresponding package maintainer. To find the maintainer of a package, use the command maintainer(\"package-name\"). Note: There is a #core-documentation channel on the R Contributors slack where you can discuss about the patches for improvements to R’s documentation. 8.7 See also Writing R documentation files "],["message-translations.html", "Chapter 9 Message Translations 9.1 How translations work 9.2 How to contribute new translations 9.3 Current status of translations in R 9.4 Helpful references", " Chapter 9 Message Translations This chapter covers internationalization in R, i.e., the display of messages in languages other than English. All output in R (such as messages emitted by stop(), warning(), or message()) is eligible for translation, as are menu labels in the GUI. Depending on the version of R that you are using, some of the languages might already be available while others may need work. R leverages the gettext program to handle the conversion from English to arbitrary target languages. Having messages available in other languages can be an important bridge for R learners not confident in English – rather than learning two things at once (coding in R and processing diagnostic information in English), they can focus on coding while getting more natural errors/warnings in their native tongue. The gettext manual is a more canonical reference for a deep understanding of how gettext works. This chapter will just give a broad overview, with particular focus on how things work for R, with the goal of making it as low-friction as possible for developers and users to contribute new/updated translations. 9.1 How translations work Each of the default packages distributed with R (i.e., those found in ./src/library such as base, utils, and stats and which have priority base) contains a po directory. A po directory is the central location for ataloguing/translating each package’s messages. It contains a template message file (.pot) for the corresponding ackage along with translated .po files (that are created using the template .pot file). 9.1.1 .pot files A .pot file is a template file found inside the po directory of an R package. This template file is a snapshot of the messages available in a given domain. A domain in R typically identifies a source package and a source language (either R or C/C++). For example, the file R-stats.pot (found in the R sources in ./src/library/stats/po) is a catalogue of all messages produced by R code in the stats package, while stats.pot is a catalogue of all messages produced by C code in the stats package. The ‘base’ package has two exceptions to the basic pattern described above. The first is the domain for messages produced by the C code which is the fundamental backing of R itself (especially, but not exclusively, the C code under ./src/main[^The file ./po/POTFILES is the canonical source of files searched. Note that while, technically, it is possible to support translations in Fortran code, R does not currently do so. Only a handful of messages are produced by Fortran routines in the R sources.]). The associated .pot file is R.pot and is found in ./src/library/base/po. R-base.potis a normal.potfile because base has a normalR` directory. The second is the domain for the Windows R GUI, i.e., the text in the menus and elsewhere in the R GUI program available for running R on Windows. These messages are stored in the RGui.pot domain, also in the po directory for base, and are most commonly derived from C code found in ./src/gnuwin32. One reason to keep this domain separate is that it is only relevant to one platform (Windows). In particular, Windows has historically different character encodings, so that it made more sense for Windows developers to produce translations specifically or Windows, since it is non-trivial for non-Windows users to test their translations for the Windows GUI. 9.1.1.1 Generating .pot files For outside contributors, there’s no need to update .pot files – translators will typically take the R .pot files as given and generate .po files. These will be sent along to a language-specific translation maintainer, who then compiles them to send to the R Core developer responsible for translations, who finally applies them as a patch. To emphasize, this section is almost always not needed for contributing translations – it is here for completeness and edification. 9.1.2 .po files .po files are the most important artifacts for translators. They provide the (human-readable!) mapping between the messages as they appear in the source code and how the messages will appear to users in translated locales. 9.1.2.1 Singular messages Most messages appear as msgid/msgstr pairs. The former gives the message as it appears in the code, while the latter shows how it should appear in translation. For example, here is an error in German (locale: de) informing the user that their input must be of class POSIXt msgid "'to' must be a \\"POSIXt\\" object" msgstr "'to' muss ein \\"POSIXt\\" Objekt sein" See this in context in the R-de.po source file. The same message can also be found in R-it.po giving the translation to Italian: msgid "'to' must be a \\"POSIXt\\" object" msgstr "'to' dev'essere un oggetto \\"POSIXt\\"" 9.1.2.2 Plural messages Some messages will have different translations depending on some input determined at run time (e.g., the length() of an input object or the nrow() of a data.frame). This presents a challenge for translation, because different languages have different rules for how to pluralize different ordinal numbers[^See the relevant section of the gettext manual]. For example, English typically adds s to any quantity of items besides 1 (1 dog, 2 dogs, 100 dogs, even 0 dogs). Chinese typically does not alter the word itself in similar situations (一只狗, 两只狗, 一百只狗, 零只狗); Arabic has six different ways to pluralize a quantity. In .po files, this shows up in the form of msgid_plural entries, followed by several ordered msgstr entries. Here’s an example from R-de.po5: msgid "Warning message:\\n" msgid_plural "Warning messages:\\n" msgstr[0] "Warnmeldung:\\n" msgstr[1] "Warnmeldungen:\\n" The two entries in English correspond to the singular and plural messages; the two entries in German correspond similarly, because pluralization rules in German are similar to those in English. The situation in Lithuanian (R-lt.po) is more divergent: msgid "Warning message:\\n" msgid_plural "Warning messages:\\n" msgstr[0] "Įspėjantis pranešimas:\\n" msgstr[1] "Įspėjantys pranešimai:\\n" msgstr[2] "Įspėjančių pranešimų:\\n" This corresponds to the 3 different ways to pluralize words in Polish. What do 0, 1, and 2 correspond to, exactly? Ideally, this will be clear to native speakers of the language, but for clarity, it is the solution to a small arithmetic problem that can be found in the language’s metadata entry. Look for the Plural-Forms entry in the metadata at the top of the .po file; here it is for Lithuanian: "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\\n" nplurals tells us how many entries correspond to each msgid_plural for this language. plural tells us, for the quantity n, which entry to use. The arithmetic is C code; most important if you really want to parse this and are only familiar with R code is C’s ternary operator: test ? valueIfTrue : valueIfFalse is a handy way to write R’s if (test) valueIfTrue else valueIfFalse. Parsing, we get the following associations: the 0 entry corresponds to when a number equals 1 modulo 10 (i.e., 1, 11, 21, 31, …) except numbers equaling 11 modulo 100 (i.e., 11, 111, 211, 311, …). Combining, that’s 1, 21, 31, …, 91, 101, 121, 131, …, 191, … the 1 entry corresponds to numbers at least 2 modulo 10 (2, 3, …, 8, 9, 12, 13, 14, …) and either below 10 modulo 100 (0, 1, …, 9, 100, 101, …, 109, …) or exceeding 20 modulo 100 (21, 22, …, 99). Combining, that’s 2, 3, …, 9, 22, 23, …, 29, 32, 33, … 39, …, 102, 103, …, 109, 122, 123, … The 2 entry corresponds to all other numbers, i.e. 0, 10, 11, 12, …, 19, 20, 30, …, 90, 100, 110, 111, 112, … 9.1.3 .mo files .po files are plain text, but while helpful for human readers, this is inefficient for consumption by computers. The .mo format is a “compiled” version of the .po file optimized for retrieving messages when R is running. In R-devel, the conversion from .po to .mo is done by R Core – you don’t need to compile these files yourself. They are stored in the R sources at ./src/library/translations/inst in various language-specific subdirectories. 9.2 How to contribute new translations Translating R into different languages helps make it more user-friendly for non-English speakers and helps to grow the R community. See the blog post on how R can use your help: Translating R messages. To get started contributing to translations, please follow the steps below: Step 1: Register an Account at Weblate Weblate is an open-source platform for collaborative translation of software projects. Register an account on R’s Weblate server, https://translate.rx.studio/, to start contributing. Note: To get started follow the detailed workflow and convention for translation which is given here: https://github.com/r-devel/translations/wiki/Conventions-for-translations Step 2: Choose a Component and Language Select a component of R with less than 100% translation. Each component corresponds to the messages in either the R code or the C code of one of the packages in base R, e.g. base (R files), or tools (C files). There is one special case: base (R GUI), which corresponds to the messages in the Windows Graphical User Interface. After selecting a component, you can select your preferred language. Step 3: Translate the Message Now, you can click on Translate button on your right. Note: More information for String status visit: https://docs.weblate.org/en/latest/workflows.html#translation-states Then, start translating the message by typing the translation in the text box. If you are confident that the translation is correct, make sure the “Needs editing” box is unchecked. If you are unsure about how to translate, write the translation as a Suggest button instead. Finally, Click “Save and Continue” to save the translation and continue. Note: Use Glossary feature within Weblate making translation easy and consistent: https://translate.rx.studio/projects/r-project/glossary/ Note: Make sure to use Automatic Suggestions as a starting point. Click on Automatic Suggestions (machine translation) Accept it if you think the automatic suggestion looks good Some Tips to follow: Be consistent: Use the same words and phrases throughout the translation to make it consistent and avoid confusion. Check for technical issues: After finishing the translation, check if you have any alerts or warning in the Weblate string status, e.g. double instead of single space. Follow language specific guidelines: Check how other languages have translated the string. Even if you are not fluent in another language it can give you an idea of how other translators have handled it, especially which parts are left verbatim. A detailed guide is given here : Conventions-for-translations#languages-and-contributions Related links: https://contributor.r-project.org/tutorials/translating-r-to-your-language/ 9.3 Current status of translations in R https://contributor.r-project.org/translations/ 9.4 Helpful references Statistical terms glossary The GitHub mirror of the actual svn repo is linked in this chapter as it is a better interface for browsing the source files.↩︎ "],["TestRVer.html", "Chapter 10 Testing Pre-release R Versions 10.1 Where to test? 10.2 What can you test? 10.3 Writing tests for R 10.4 Benchmarks", " Chapter 10 Testing Pre-release R Versions This chapter is inspired from the blog on testing R before release and discusses how you can help with testing of pre-release versions of R. 10.1 Where to test? Whenever possible use a fresh package library for testing, even better would be to use virtual machines for the testing. This would ensure that you do not damage your existing R installation. 10.1.1 Virtual machine A free Windows 10 virtual machine is provided by Microsoft (with a 90-day limit) for building, testing, and checking R packages and R itself. Package maintainers who work on Linux and MacOS can use it to test their packages on Windows. Read the instructions on how to automatically set up the machine to check R packages. Tomas Kalibera describes the details of using virtual machine in the blog Virtual Windows machine for checking R packages. 10.2 What can you test? You can test: Your own programs. Your own workflows. Your special ways of installing or setting up R. Things that interact with external libraries. Interactive R packages. Details of performing testing on various operating systems: Windows macOS Linux Solaris 10.3 Writing tests for R Writing tests for R is much like writing tests for your own code. Tests need to be thorough, fast, isolated, consistently repeatable, and as simple as possible. When you are adding tests to an existing test file, it is also recommended that you study the other tests in that file; it will teach you which precautions you have to take to make your tests robust and portable. We try to have tests both for normal behaviour and for error conditions. Tests live in the tests directory. 10.4 Benchmarks Benchmarking is useful to test that a change does not degrade performance. "],["CoreDev.html", "Chapter 11 R Core Developers", " Chapter 11 R Core Developers This page lists the former and current members of the R Core team who have write access to the R source. Brian Ripley (present) Deepayan Sarkar (present) Douglas Bates (present) Duncan Murdoch (up to September 2017) Duncan Temple Lang (present) Friedrich Leisch (present) Guido Masarotto (up to June 2003) Heiner Schwarte (up to October 1999) John Chambers (present) Kurt Hornik (present) Luke Tierney (present) Martin Maechler (present) Sebastian Meyer (present) Martin Morgan (up to June 2021) Martyn Plummer (present) Michael Lawrence (present) Paul Murrell (present) Peter Dalgaard (present) Robert Gentleman (present) Ross Ihaka (present) Seth Falcon (up to August 2015) Simon Urbanek (present) Stefano lacus (up to July 2014) Thomas Lumley (present) Tomas Kalibera (present) Uwe Ligges (present) View the affiliations of R Core members. We’ve left it up to the individual core developers to list areas of expertise (or things they are willing to maintain) if they wish. The Contributors page on the R Project website also lists contributors, outside the R Core team, who provided invaluable help by donating code, bug fixes, and documentation. "],["WhereToGetHelp.html", "Chapter 12 Where to Get Help 12.1 Slack 12.2 Mailing lists 12.3 File a bug", " Chapter 12 Where to Get Help If you are working on R it is possible that you will come across an issue where you would need some assistance to solve it. If you require help, there are options available to seek assistance or get some feedback which are discussed in this chapter. If the question involves process or tool usage then please check the rest of this guide first as it should answer your question. Please make sure to search the documentation and resources to see if your question has already been addressed. If not, then ask for assistance in the appropriate forum. Many developers are volunteers and please be polite, patient, and thoughtful when requesting for feedback or help. 12.1 Slack You can discuss issues related to the development of R and learn about the process of contributing to R on the R Contributors slack. There are a number of experienced developers on this slack who can answer questions and/or provide feedback. The following channels are available on the R-devel slack for help and feedback with specific areas: #bugreports-for-review: Share bug reports for review/feedback before submitting to Bugzilla. #core-dev-help: Getting help on anything related to R Core contribution. #core-documentation: Discuss patches/improvements to R’s documentation. #core-translation: Discuss translating R messages, warnings, and errors into non-English languages. #patches-for-review: Share patches for peer review before submitting to R Core. Note: You may not be able to access the history of these channels, so it cannot be used as a knowledge base of sorts. 12.2 Mailing lists There are quite a few mailing lists for getting help with R: R-devel: Questions and discussion about development of R vs. with R. Getting help with technical programming issues, e.g. interfacing R with C/C++. Proposals of new functionality for R. Pre-testing of new versions of R. Enhancements and patches to the R source code and the R documentation. Posting examples and benchmarks. R-help: Discussions about problems and solutions using R. R-package-devel: Getting help about package development in R. Learning about the package development process. Discussing problems developing a package (or problem in passing the R CMD check). Please avoid cross-posting to both the R-package-devel and the R-devel mailing lists. 12.3 File a bug If you strongly suspect you have come across a bug (be it in the build process, or in other areas), then report it on Bugzilla. "],["News.html", "Chapter 13 News and Announcements 13.1 Blogs 13.2 Conferences 13.3 Journal 13.4 Mailing lists 13.5 Twitter", " Chapter 13 News and Announcements Here are some resources that can be useful to keep up with the developments in R: 13.1 Blogs The R project maintains The R Blog with posts mainly written by the R Core Team. News of changes in the development version of R found on the Daily News about R-devel blog which is updated daily. 13.2 Conferences Updates about conferences actively supported or endorsed by The R Foundation can be found here. These conferences are organised by members from the R community. 13.3 Journal The R Journal is an open access and refereed journal featuring short to medium length articles that should be of interest to users or developers of R. It also has a news section where information on, changes in R (new features of the latest release), changes on CRAN (new add-on packages, manuals, binary contributions, mirrors, etc.), upcoming conferences, and conference reports is provided. 13.4 Mailing lists R-announce: A moderated mailing list used for announcements by the R Core Development Team. Major announcements about the development of R and the availability of new code are made here. R-packages: A moderated mailing list for announcements about contributed R packages (typically on CRAN) and similar R project extensions. 13.5 Twitter Follow @R_dev_news on Twitter for news of changes in the development version of R and new posts on The R Blog announcements. "],["DevTools.html", "Chapter 14 Developer Tools 14.1 Subversion (svn) client 14.2 Globally search for a regular expression and print matching lines (grep) 14.3 Git 14.4 GitHub", " Chapter 14 Developer Tools This chapter lists resources and tools which R developers may use. Here we will go over some commonly used tools that are relevant to R’s workflow. As there are several ways to accomplish these tasks, this chapter reflects methods suitable for new contributors. Experienced contributors may desire a different approach. 14.1 Subversion (svn) client Subversion (svn) is a version control system that tracks any changes made to files and directories. You can install either the TortoiseSVN (https://tortoisesvn.net/, command line tool, and Windows Explorer integration) or the SlikSVN (https://sliksvn.com/download/, just the command line tool) client. They have Windows installers and can be used from Windows cmd or RStudio terminal. Some resources for learning subversion commands: Apache Subversion quick start guide TortoiseSVN commands SlikSVN basics Subversion book 14.2 Globally search for a regular expression and print matching lines (grep) grep is a command line utility for searching plain text data sets for lines that match a regular expression. Refer the grep manual for more commands. 14.3 Git Git is also a version control system for tracking changes in any files and directories. View git documentation for learning git commands. 14.4 GitHub Some resources that are useful while using GitHub are: Creating a pull request Opening an issue from code Resolving a merge conflict on GitHub "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] +[["index.html", "R Development Guide ", " R Development Guide R Contribution Working Group 2023-09-30 R Logo "],["acknowledgement.html", "Acknowledgement", " Acknowledgement This guide draws on documentation and articles written by the R Core Team. The first version of the guide was heavily influenced by the Python Developer’s Guide. Initial chapters of the guide were developed by Saranjeet Kaur Bhogal, in a project funded by the R Foundation, mentored by Heather Turner and Michael Lawrence. This initial version was upgraded in a Google Season of Docs 2022 project with Saranjeet Kaur Bhogal and Lluís Revilla Sancho working as technical writers managed by Nicolas Bennett and overseen by a Steering Committee including representatives from R Core and the wider R community. This guide has benefited and continues to benefit from varied contributions by several contributors. This project is licensed under a Creative Commons Attribution 4.0 International (CC BY 4.0). Some pages may contain materials that are subject to copyright, in which case you will see the copyright notice. "],["introduction.html", "Chapter 1 Introduction 1.1 Overview of different ways of contributing to the base R Project 1.2 Quick start to the guide 1.3 How to contribute to this guide itself?", " Chapter 1 Introduction This guide is a comprehensive resource for contributing to base R1 – for both new and experienced contributors. It is maintained by the R Contribution Working Group. We welcome your contributions to base R! 1.1 Overview of different ways of contributing to the base R Project Contributions to base R are possible in a number of different ways. Some of them are listed below: Contributing to bug fixing: Refer Bug Tracking and Reviewing Bugs. Contributing to translations: Refer Translations. Testing R before release: Refer Testing Pre-release R Versions. 1.2 Quick start to the guide The guide is intended as a comprehensive resource for contributing to base R. The following chapter outline provides an overview with links to sections for getting started with contributing. The Getting Started covers the instructions on how to install R on the major operating systems (Windows, Linux and macOS), as well as the tools required to build R and R packages from source. The Bug Tracking and the Reviewing Bugs chapters discuss how to find bugs in R and how to review bug reports that are submitted to Bugzilla. The Finding the Source chapter provides an overview of the R codebase and helps with finding source code of base functions written in R and/or C. The Lifecycle of a Patch chapter discusses how to create a patch to propose a bug fix. The Documenting R chapter describes the format and style guide for help files in R, how to report and review issues in the existing documentation and how to propose changes. How to test pre-release versions of R is discussed in the chapter on Testing Pre-release R Versions. The R Core Developers chapter contains a list of the former and current members of the R Core team who have write access to the R source. For more information on how to engage with to community and ask for help, refer to the Where to Get Help chapter. To keep up with the developments in R refer to some of the resources available in the News and Announcements Resources and tools that may be relevant for R developers are available in the Developer Tools chapter. 1.3 How to contribute to this guide itself? This guide is built using bookdown which makes editing it easier, provided you have a GitHub account (sign-up at github.com). After you log-in to GitHub, click on the ‘Edit’ icon highlighted with a red ellipse in the image below. This will take you to an editable version of the the source R Markdown file that generated the page you are on: Screenshot of the toolbar in the HTML version of the guide, with the Edit button (pencil and paper icon) circled in red. Use the issue tracker to raise an issue about the guide’s content or to make a feature request. Maintainers and contributors are requested to follow this project’s code of conduct. The set of packages in the base R distribution that are maintained by the R Core Team.↩︎ "],["GetStart.html", "Chapter 2 R Patched and Development Versions 2.1 The R source code 2.2 Prerequisites 2.3 Building R 2.4 See also", " Chapter 2 R Patched and Development Versions These instructions cover how to install R from source or from binaries. Contributors will typically need to work with the patched or development versions of R. This chapter describes where the source code for these versions can be found and how to install these versions from the source or the binary builds (where available). The tools required to build R and R packages are also discussed. For the most up to date and complete instructions you can check the R installation and administration manual . 2.1 The R source code R uses svn as a version control tool hosted at https://svn.r-project.org/R/ and uses a ‘major.minor.patchlevel’ version numbering scheme2. There are three releases of R available to install: The latest official release (r-release), either major version x.0.0 or minor version x.y.0, for example: 3.0.0 or 3.2.0 The patched release (r-patched), for example 3.0.1 or 3.2.1 and The development release (r-devel) : continually developed version moving from r-release to next major/minor version (x + 1).0.0 or x.(y + 1).0 a few weeks before release (at the start of the “GRAND FEATURE FREEZE”). The source code of released versions of R can be found at R/tags, the patched versions are at R/branch. The r-devel at R/trunk is the next minor or eventual major release development version of R. Bug fixes and new features are introduced in r-devel first. If the change meets the development guidelines R Core will also make the change in r-patched. 2.2 Prerequisites To install from the source code you will need the source code and the dependencies of R. If you need to install svn you can use your distribution’s package manager to install it. 2.2.1 Ubuntu In Ubuntu you can use this command to find all the dependencies of R: apt-rdepends --build-depends --follow=DEPENDS r-base-dev | grep " B" | sed -e "s/ Build-Depends: //" It might require installation of apt-rdepends which can be done from default repositories via sudo apt-get install apt-rdepends. To install all the R dependencies you can use: sudo apt-get build-dep r-base-dev 2.2.2 Fedora In Fedora you can use this command to find all the dependencies of R: dnf rq -q --repo=fedora-source --requires R You will also need the rsync package to download the recommended packages. To install them you can use: dnf install 'dnf-command(builddep)' dnf install rsync dnf builddep R 2.3 Building R 2.3.1 Linux Here are the basic steps intended as a checklist. For complete instructions please see the section in R-admin. Retrieve R source code via into TOP_SRCDIR, note that we retrieve the r-devel source code: export TOP_SRCDIR="$HOME/Downloads/R" svn checkout https://svn.r-project.org/R/trunk/ "$TOP_SRCDIR" Download the latest recommended packages3: "$TOP_SRCDIR/tools/rsync-recommended" Create the build directory in the BUILDDIR: export BUILDDIR="$HOME/bin/R" mkdir -p "$BUILDDIR" cd "$BUILDDIR" Configure the R installation (with --enable-R-shlib so that RStudio IDE can use it): "$TOP_SRCDIR/configure" --enable-R-shlib Build R : make Check that R works as expected: make check There are other checks you can run: make check-devel make check-recommended If we don’t want to build R in a different directory than the source code we can simply use: cd "$TOP_SRCDIR" svn update tools/rsync-recommended "$TOP_SRCDIR/configure" --enable-R-shlib make make check Once you successfully built R from source you can modify the R source code to fix an issue: Prepare a patch (See this guide) and after checking that R works as intended (make check-devel) submit the patch for consideration by R Core. (See the lifecycle of a patch chapter). To use the r-devel version in RStudio, you can do the following: export RSTUDIO_WHICH_R="$BUILDDIR/bin/R" cd "$TOP_SRCDIR" rstudio 2.3.2 Windows 2.3.2.1 Binaries The binary builds of R for Windows can be downloaded and installed from here. Along with the link to the latest stable release, this page also contains links to the binary builds of r-patched and r-devel. Click on the download links to download an executable installer. Select the language while installing, read the GNU general public license information, and select the destination location to start the installation. You will be prompted to select components at this stage: User installation, 64-bit User installation, or Custom installation. The default option may be chosen for the questions from this step onwards to complete the installation. Daily binaries for r-devel are made available for download and installation. 2.3.2.2 From source Before installing R from source, some additional programs are needed, as per the latest documentation: Rtools is the suggested toolchain bundle for building R base and R packages containing compiled code on Windows. The latest version of Rtools can be installed using the Rtools installer rtools43-XXXX-XXX.exe. A LaTeX compiler is needed to install and build R, check packages and build manuals. On CRAN, MiKTeX is used, which can be downloaded from https://miktex.org. Once installed open MiKTeX via the Windows start menu. It might ask to check for updates and more importantly, to make it available in PATH. You can accept both. Open the Rtools43 terminal to update and install subversion: pacman -Syuu pacman -Sy wget subversion Retrieve the latest source code via subversion: export TOP_SRCDIR="$HOME/Downloads/R" svn checkout https://svn.r-project.org/R/trunk/ "$TOP_SRCDIR" If you already have the repository available you can update as: cd $TOP_SRCDIR svn update You can also use a SVN client such as TortoiseSVN (https://tortoisesvn.net/, command line tool, and Windows Explorer integration) or SlikSVN (https://sliksvn.com/download/, just the command line tool) so that it can be also found by other tools. Download the latest tcl/tk and unzip it in $TOP_SRCDIR: cd "$TOP_SRCDIR" wget -np -nd -r -l1 -A 'tcltk-*.zip' https://cran.r-project.org/bin/windows/Rtools/rtools43/files/ unzip "tcltk-*.zip" Add gcc, MiKTeX and tar to the PATH and set one tar option: export PATH="/x86_64-w64-mingw32.static.posix/bin:$PATH" export PATH="/c/Program Files/MiKTeX/miktex/bin/x64:$PATH" export TAR="/usr/bin/tar" export TAR_OPTIONS="--force-local" If MiKTeX was installed just for your user you might need to run: export PATH="/c/Users/$USER/AppData/Local/Programs/MiKTeX/miktex/bin/x64:$PATH" Check that all the programs can be found: which make gcc pdflatex tar If there is any error you’ll need to find where the program is installed and add the corresponding path. Download the latest recommended packages4: cd "$TOP_SRCDIR/src/gnuwin32/" "$TOP_SRCDIR/tools/rsync-recommended" Build R and the recommended packages: make all recommended The recently compiled version of R will be at $TOP_SRCDIR/bin/. In RStudio you can select that folder and restart it to use the r-devel version. Check that R works as expected: make check There are other checks you can run for testing the successful installation of the recommended packages: make check-devel make check-recommended 2.3.3 macOS This section will be added after the official installation instructions for macOS in the R installation and administration manual have been updated for R 4.3.0. 2.4 See also CRAN official website R installation and administration manual R for macOS Tools for R in macOS R for requirements in macOS R for Windows FAQ RTools toolchains for Windows R FAQ Also known as semantic versioning↩︎ Recommended packages are not in the subversion repository.↩︎ Recommended packages are not in the subversion repository.↩︎ "],["IssueTrack.html", "Chapter 3 Issue Tracking 3.1 How to contribute to issue tracking? 3.2 How to get a Bugzilla account?", " Chapter 3 Issue Tracking Base R uses Bugzilla for issue tracking and reporting bugs. 3.1 How to contribute to issue tracking? Contributors can support issue tracking in R by Reporting bugs or making feature requests (bug reports filed under the “Wishlist” component in Bugzilla), Reviewing bug reports to help close reports where no fix is needed or to help narrow down the problem and identify what needs to be fixed, or Proposing changes to code or documentation that will close an issue. 3.2 How to get a Bugzilla account? Anyone can browse the bug reports on Bugzilla, but you will need an account to file a bug report, to comment on an existing bug report, or to submit a proposed fix in the form of patch file. To get a Bugzilla account send an e-mail to bug-report-request@r-project.org from the address you want to use as your Bugzilla login. Briefly explain why you want a Bugzilla account and a volunteer will add you to R’s Bugzilla members. After having successfully logged in to Bugzilla, you are good to go. 3.2.1 Navigating Bugzilla An image of the existing home page of Bugzilla is shared below: Screenshot of the existing home page of Bugzilla. On the home page of Bugzilla, there are various buttons and links. There are four square buttons called as: Screenshot of the four square buttons on the home page of Bugzilla. File a bug: You will have to log in to Bugzilla to file a bug using this button Search: When you click this button you will get a page with ‘Simple Search’ and ‘Advanced Search’ options. Either of the search options could be used depending on what you are looking for. Log In: Provide the appropriate email address and password here to log in to Bugzilla. Documentation: Provides a user guide for R's Bugzilla. Several useful shortcuts are available from the landing page: Enter a new bug report Show open bugs new-to-old Search existing bug reports A quick search bar is available on the home page where you can enter a bug number to search or some search terms. Screenshot of the quick search bar on the home page of Bugzilla. There is also a section for Common Queries on the home page which includes links to bugs reported and changed in the last 24 hours and last 7 days. Screenshot of the Common Queries section on the home page of Bugzilla. "],["ReportingBugs.html", "Chapter 4 Reporting Bugs 4.1 What is a bug in R? 4.2 What condition might not be a bug? 4.3 Checking if a bug is already reported 4.4 What are some places where you may find a bug? 4.5 How to report a bug? 4.6 Good practices in reporting bugs / Expectations of a good bug report 4.7 Disagreement with a resolution on the bug tracker 4.8 Examples of Bug reports submitted on Bugzilla or R-devel mailing list 4.9 See also", " Chapter 4 Reporting Bugs 4.1 What is a bug in R? You may find a bug in R if: The R session terminates unexpectedly, or there is a segmentation fault, it might be a bug in R, unless you have written your own call to compiled code or an internal function (via .C or .Internal). The error may look like this: ## *** caught segfault *** ## address (nil), cause 'memory not mapped' If the code does not do what the documentation says it should, then either the code or the documentation is wrong. Report either of which needs to be fixed. Note: When you are in doubt that there is a bug: (which should be the case most of the time!) Make sure whether the bug appears in a clean session of R. Many times, there are variables/commands/functions stored in the workspace which might cause issues. Hence, check if the issue happens in a clean session. To do so, launch R from the command line with the --vanilla option. At times the code that is written is very complicated, has numerous package and file dependencies, has many function calls, etc.. In such scenarios it is quite common that the code throws an error and you are not able to solve it. You may tend to think that there is a bug that needs to be reported. Before doing so, try to produce a minimum working example of the code for the section where the error occurred. Add only those packages and files which are required by that section, and see if the error still appears. Using this approach shall solve most of the errors. Install R-devel, which is the most recent version of R from svn / git or daily Windows build, and see if your bug still exists in R-devel (it may have been fixed very recently). Search on the R-devel mailing list for messages with keywords related to your possible bug. If you find some related messages then read them to see if they clarify whether or not it is a bug. If you do not find any related messages, then please post a new message to R-devel. Your message should include (1) a brief description of the bug including current and expected behavior, (2) a minimal reproducible example. 4.2 What condition might not be a bug? In case the code is doing something unexpected, it may not necessarily be a bug. Carefully review the documentation of the function being called, and check whether the behaviour being exhibited on calling this function is the same as it was designed to do. Issues with seemingly identical numbers not being equal (especially floating point numbers) are usually not bugs. If R is running slower than expected, then this also may not be a bug. Ask someone else to review your code in such a case. If some function is working, but it is not defined in the best generalised way, then consult someone to look over the code. This may perhaps not be a bug; instead, it might be an alternative way of writing the function. 4.3 Checking if a bug is already reported The first step before filing a bug report is to see whether the problem has already been reported. Checking if the bug is reported will: Save time for you and the developers. Help you see if the bug is already fixed for the next release. Lead you to learn what needs to be done to fix it. Determine if any additional information is needed. The sections that follow discuss where to check whether a bug is already reported. 4.4 What are some places where you may find a bug? You may find a bug in: In the R-Core supported packages, their documentations, and/ or in the R language implementation. In packages and/or their documentations which are not supported by the R-Core. 4.5 How to report a bug? Once you confirm a bug exists, you need to submit a bug report so that it gets fixed. 4.5.1 Bug in the R-Core supported packages, their documentations, and/ or in the R language Packages that are supported by the R-Core are labelled with Maintainer: R Core Team <R-core@r-project.org>. One simple way to get the information from R is by running the maintainer(\"package_name\") command. The bug report for R-Core supported packages, their documentations, and/ or a bug report for the R language itself can be submitted either to R-devel, see posting guide, or to Bugzilla. In the future, we hope to have an option to report an issue to the GitHub Mirror of the R svn server. In order to report bugs, as well as fixes, using Bugzilla, please ensure that you have a Bugzilla account Please ensure whether the bug is already fixed (in the upcoming changes in R) or reported (search for it from those already reported on Bugzilla, either on search existing bug reports, using the advanced search option here, or show open bugs new-to-old). 4.5.2 Bug in the non R-Core supported packages and/or their documentations For packages that are not maintained by the R-Core, the bug reports can be submitted at, perhaps, an issues tracker url on GitHub/GitLab/R-Forge. To find if such an issues tracker is available, you can look at the package DESCRIPTION file first (e.g. using packageDescription(\"package_name\")) to check if a url is provided in the BugReports field. If that is not available, then the package maintainer can be contacted (using maintainer(\"package_name\")). In R running the function bug.report(package = \"package_name\") shall direct you to either the GitHub issue tracker of the package, or to the bug tracking web page, or towards composing an e-mail to the package maintainer. This function bug.report is disabled in RStudio, by default. However, if you use utils::bug.report(package = \"package_name\") then it works on RStudio as well. Please ensure that the bug is not already reported or fixed before reporting it in any of the ways suggested above. 4.6 Good practices in reporting bugs / Expectations of a good bug report If you follow the practices given below, you will come up with a good bug report which might make it easier for the maintainer(s) to fix the bug. Include a minimal reproducible example of the bug in your report. The maintainer should be able to quickly reproduce the bug using the minimal example that you provide. Here is a community wiki post on how to make a minimal reproducible example. Mention the software architecture on which the bug occurred. Use inbuilt data sets as far as possible. In addition to the above, here are the bug writing guidelines on Bugzilla. The bug reporting documentation in R also discusses practices to write a good bug report. Once you have successfully reported a bug, you will likely receive an update each time an action is taken on the bug. On Bugzilla, the report may be given one of the following status: New, Assigned, Confirmed, Reopened, Unconfirmed. 4.7 Disagreement with a resolution on the bug tracker As humans, there might be differences of opinions from time to time. What needs to be considered here is to be respectful of the fact that care, thought, and volunteer time has gone into the resolution of the issue or bug. If you take some time, then on reflection, the resolution steps may seem more reasonable than you initially thought. If you still feel that the resolution is incorrect, then raise a thoughtful question to the person who resolved it. If the issue was not carefully thought about in the first place then it is less likely to win any conversion of thought. As a reminder, issues closed by a core developer on Bugzilla have already been carefully considered. Please do not reopen a closed issue. Although one can comment on a closed issue, if necessary. Every comment on an issue generates an email to every R-core member (unless they have the notifications disabled). So it would be best to be considerate while commenting on issues, especially in case of closed issues or when you are commenting in pure agreement without adding anything beyond that to a discussion (the +1 type posts which are perfectly acceptable in other contexts). 4.8 Examples of Bug reports submitted on Bugzilla or R-devel mailing list If you like to see how bugs are reported on Bugzilla, here are some examples: Bug 17767 - Warning about incomplete argument within nlme: A bug report with a reproducible example, a patch, and a review. Possible bug when finding shared libraries during staged installation: A bug report submitted by Kara Woo which was promptly fixed via the R-devel mailing list. (More information about the R-devel mailing list can be found here). Bug: time complexity of substring is quadratic as string size and number of substrings increases: A substring reported by Toby Dylan Hocking and fixed by Tomas Kalibera, Feb 2019 via the R-devel mailing list. patch for gregexpr(perl=TRUE): A gregexpr bug report and patch submitted by Toby Dylan Hocking and merged by Tomas Kalibera, Feb 2019 via the R-devel mailing list. 4.9 See also Reporting a bug R FAQ on bugs Bugzilla guidelines of reporting a bug "],["ReviewBugs.html", "Chapter 5 Reviewing Bugs 5.1 How you can help to review bug reports? 5.2 Classifying bug reports 5.3 How to find a bug report or an issue to review? 5.4 Example of a bug review submitted on Bugzilla 5.5 See also", " Chapter 5 Reviewing Bugs 5.1 How you can help to review bug reports? After understanding where bugs are reported in R (Bugzilla) or in other projects (GitHub/GitLab/R-Forge), a great way to contribute is reviewing bug reports. Around the clock, new bug reports are being submitted on Bugzilla or the bug trackers (for instance, GitHub issues) of R packages and existing bug reports are being updated. Every bug report needs to be reviewed to make sure various things are in proper order. You can help with this process of reviewing bugs. 5.1.1 Preparing to review bug reports If you want to review bug reports on Bugzilla, you are required to have a Bugzilla account. More details on how you can review a bug report are available on this post on the R Blog: R Can Use Your Help: Reviewing Bug Reports 5.2 Classifying bug reports A good bug report is the one which: Explains clearly how to reproduce the bug. Includes the version of R, the machine architecture, and the operating system platform on which the bug occurred. Relevant details should be a part of a good bug report. You can help with the following tasks once you have some R programming experience: Reproducing the bug: If you see a bug report which does not clearly explain how to reproduce it, you can try reproducing the bug and eventually make things easier for the core developer(s) and/or package maintainer(s). Checking different binary builds: Check whether the bug occurs on a different binary build of R. It is helpful to know whether the bug is affecting: r-patched, r-devel, or r-release binary builds of R. Writing a unit test: If the bug report lacks a unit test that should be a part of R’s test suite, then you can help with providing it. These helpful tasks allow the Core developers and/ or maintainers to classify a bug report properly, so that the bug can be handled in a timely fashion. 5.3 How to find a bug report or an issue to review? You may search old bug reports or issues that could be closed. Old bug reports may no longer be valid or may include a patch that is ready to be committed, but no one has had the time to review and commit. You might also want to search for issues in topics in which you have a working knowledge. When on Bugzilla you can use the advanced search to find specific topics. Bug reports are by default public on Bugzilla (unless the defaults are changed to avoid security vulnerability). 5.4 Example of a bug review submitted on Bugzilla If you would like to see how bugs are reviewed on Bugzilla, the Bug 16542 - nlme:::summary.lmList with unequal outputs per group is an example where an old bug report is being reviewed. It is tested to see if it was still an issue and a few ways are proposed to resolve the issue. Note: There is a #bug-reporting channel on the R Contributors slack where you can share your bug report(s) for review/feedback before submitting to Bugzilla. This can help with checking that it really is a bug, that you have included the important information and excluded redundant information. 5.5 See also Reviewing bug reports: Blog "],["FindSource.html", "Chapter 6 Finding the Source 6.1 Finding R source code 6.2 Finding C source code 6.3 See also", " Chapter 6 Finding the Source This chapter discusses how you can have an overview of the R codebase. For instance, where to find the implementation of a base function written in R and where to find a primitive implementation written in C. You may want to find the source code of a function just out of curiosity or maybe to gain more insight into what a particular function is actually doing. Whatever be the case, reading the source code will help you to learn a lot about any function. 6.1 Finding R source code Find the R function with the code of interest. You will always be able to print the top-level function (or use View(function_name) in RStudio). Looking at the code for the body of this function will reveal what you need to do next: Can already see code of interest: stop here or skip to step 3 to find the corresponding file in the R sources. Code of interest is in nested R function: go to step 2. Top-level function is an S3 generic, identified by a call to UseMethod(). Use methods(function_name) to see available methods, then go to step 2. Code of interest is in compiled code, identified by a call to .C(), .Call(), .Fortran(), and .External(), or .Internal() and .Primitive(): go to section on compiled code. Nested functions or S3 methods may not be exported by the package they are in. If this is the case, the simplest way to view the code is to use getAnywhere() or getS3method(). Now you can keep looking at nested R functions till you find the code of interest or hit a call to compiled code. Find an R function in the R sources. Two options here: Search on the internet: For R Core packages, search on the GitHub mirror (https://github.com/r-devel/r-svn); for recommended packages, use the CRAN mirror (https://github.com/cran) - this will link to the source on GitHub if available, e.g. https://github.com/cran/survival. Note that GitHub search ignores wildcard characters . , : ; / \\ ` ' " = * ! ? # $ & + ^ | ~ < > ( ) { } [ ] but this does not include - so you can search for a function or S3 method as follows: "body <- function" extension:R "quantile.ecdf <- function" extension:R Search in the R sources using grep: The Getting Started chapter discusses how to download the R sources directly or from the svn repository. Now if the sources are in ~/R-devel, you can search as follows: grep -R "body <- function" ~/R-devel/src grep -R "quantile <- function" ~/R-devel/src/library Note: The above procedure does not cover S4, R6 or RC generics or methods. Refer accessing R source for further details. 6.2 Finding C source code If .Internal() or .Primitive(), find entry point in names.c as described in the Jenny Bryan’s post of accessing R source. For all other calls to compiled code, you can find the entry point from within R. For instance, the body of complete.cases() is .External(C_compcases, ...) C_compcases inherits from class “NativeSymbolInfo” and we can extract the name of the entry point via stats:::C_compcases$name We know that it is in the stats package as we see that when we print complete.cases or look at the help file. This shows us that the entry point is simply “compcases” and in fact that is the general convention in R code, that you simply remove the C_ prefix (sometimes .F_ for Fortran code) in the name of the object passed to the first argument of the call. Once you have the entry point, search as for R code. In the case of searching on GitHub, restrict the search to files with the relevant extension compcases path:*.c lowesw path:*.f similarly for grep grep -R --include=*.c "compcases" ~/R-devel/src/library/ Note: Many editors (like RStudio, ESS) support ctags for code browsing, making it easy to jump to definitions of functions. R CMD rtags can generate ctags for any R code (Credit: Deepayan Sarkar). A more sophisticated system is called GNU GLOBAL, which also supports finding all references (calls) to a function. GitHub has a code navigation feature via the library tree-sitter. Unfortunately, it does not have R support yet. An R driver for tree-sitter made by Jim Hester is available. 6.3 See also Read the R source blogpost. "],["FixBug.html", "Chapter 7 Lifecycle of a Patch 7.1 Introduction 7.2 When do you submit a patch? 7.3 What tools are required to submit a patch? 7.4 How to prepare a patch? 7.5 Making good patches 7.6 Submitting your patch for review 7.7 Getting your patch reviewed 7.8 Leaving a patch review on Bugzilla 7.9 Dismissing review from another core developer 7.10 Acceptance or rejection of your patch 7.11 Examples of patch reports on Bugzilla 7.12 Examples of reviewing a patch 7.13 See also", " Chapter 7 Lifecycle of a Patch 7.1 Introduction R uses a workflow based on patches. A patch is the set of differences (additions and deletions) between two versions of code. So you can create a patch defining a bug fix or a proposed update to the R codebase and submit it through your official Bugzilla account to the core developer(s). Be clear in your communication as it is the key to contributing to any project, especially an open source project like R. 7.2 When do you submit a patch? There might be a situation where you come across a bug in R, which you may have an idea of how to fix. This can turn out to be an opportunity for you to submit a patch. By submitting a patch or a bug fix, you are helping to reduce the workload on the R developers in addition to yourself being a contributor to R! When you submit a patch, you are helping the developer(s) and maintainer(s) so that they do not have to write the entire code from scratch. Instead, they can test and tweak your patch, if necessary. 7.3 What tools are required to submit a patch? To submit a patch, you need: SVN installed on your machine. The latest developer version of R. You can retrieve the latest source code of R via: export TOP_SRCDIR="$HOME/Downloads/R" svn checkout https://svn.r-project.org/R/trunk/ "$TOP_SRCDIR" Depending on the operative system you might need to do some steps before that. The different steps required can be found in previous chapters of the book, for Windows, macOS and Linux. 7.4 How to prepare a patch? If you have the source code in $TOP_SRCDIR you can edit the files, for example a documentation file such as \"$TOP_SRCDIR\"/src/library/stats/man/Multinom.Rd, to make your desired changes to that or more files. Then you should check that R still works as expected via: cd "$TOP_SRCDIR" make check-devel If there is no test for your proposed change you can add a new regression test, following the guidelines. Then you should bring changes from the repository into the working copy, in case any other change has been introduced, and create a path.diff file with just the changes you want to propose to the R core: svn update svn diff > patch.diff This patch.diff file is the one that can be proposed to the R core via Bugzilla. You can also ask for reviews to the patch before proposing it to the R core via the r-devel mailing list or the slack channel of the R-contributors space. 7.4.1 Using a git mirror Besides checking in your computer, you can use the Github mirror r-devel/r-svn of the source code to check this patch with different configurations and OS. You should first find the file to edit, via the github interface for example: Screenshot of the heading of the src/library/stats/man/Mulinom.Rd Then you can edit it, directly in the interface or using the github interface: Screenshot of the file src/library/stats/man/Mulinom.Rd being edited via the Github interface Create a commit with a message describing the changes Screenshot of the commit message And create a pull request from the branch created to check the changes. Screenshot of the message when opening a pull requests from the branch Add a message and description of the svn for other users and the R core to know what is the purpose of this modification: Screenshot of the message and content while opening a pull requests for the r-svn repository Screenshot of the pull requests opened Once the PR is submitted, some automatic checks will be triggered (they might need to be approved by some other users as per Github rules): When the checks end you will need to explore the results and asses if the results indicate a problem or not. Screenshot of the results of the Github checks in the r-svn mirror Once you are happy with the changes and the checks report that everything is okay you can retrieve the patch via: https://patch-diff.githubusercontent.com/raw/r-devel/r-svn/pull/<pull_request_number>.diff With that file you can submit your patch, remember to check if it meets the recommendations for good patches. If you want to use git from the terminal to create the pull request (PR) to test the changes, you can use this summary of the available git commands. 7.5 Making good patches When creating a patch for submission, there are several things that you can do to help ensure that your patch is accepted: Make sure to follow R’s coding standards (R is a GNU project and there are GNU coding standards). The coding style of the patch you submit should largely match with the codebase it is being applied to. If your patch has one or two minor discrepancies, then those may be fixed by the core developer who will eventually test your patch. However, if there are systematic deviations from the style guides your patch will be put on hold until you fix the formatting issues. There is no comprehensive official R style manual, however some nearly universal standards are summarised in this article. Be aware of backwards-compatibility considerations. While the core developer who eventually handles your patch will make the final call on whether something is acceptable, thinking about backwards-compatibility early will help prevent having your patch rejected on these grounds. Put yourself in the shoes of someone whose code will be broken by the change(s) introduced by the patch. It is quite likely that any change made will break someone’s code, so you need to have a good reason to make a change as you will be forcing someone to update their code. This obviously does not apply to new functions or new arguments. New arguments should be optional and have default values which maintain the existing behaviour. If in doubt, discuss the issue with experienced developers. Make sure you have proper tests to verify that your patch works as expected. Patches may not be accepted without the proper tests. Make sure the entire test suite runs without failure because of your changes. It is not sufficient to only run whichever test seems impacted by your changes, because there might be interactions unknown to you between your changes and some other part of the interpreter. Proper documentation additions/changes should be included. Each bugfix should ideally be addressed by a single patch. In particular, do not fix more than one issue in the same patch (except, if one code change fixes all of them) and do not do cosmetic changes to unrelated code in the same patch as some bugfix. 7.6 Submitting your patch for review Patch in response to a pre-existing issue or bug report: In this case, you should attach the patch to the existing issue or bug report on Bugzilla with a brief comment. Patch in response to an unreported issue or bug report: Assuming you already performed a search on Bugzilla for a pre-existing issue or bug and did not find the issue or bug reported, you need to create a new bug report and include your patch with it. Please fill in as much relevant detail as possible to prevent reviewers from having to delay reviewing your patch because of lack of information. Include (mostly as the first sentence), a to-the-point explanation of what the purpose of the patch is. This sentence should not be in the descriptive form, rather an imperative form will be more suitable here. If this is not enough detail for a patch, a new paragraphs(s) can be added to explain in proper depth what has happened. The details should be good enough that a core developer reading it understands the justification for the change. 7.7 Getting your patch reviewed To begin with, please be patient. There are many more people submitting patches than there are people capable of reviewing your patches. Getting your patch reviewed requires a reviewer to have the spare time and motivation to look at your patch. We cannot force anyone to review patches and no one is employed to look at patches. There is a #patches-for-review channel on the R Contributors slack where you can share your patch(es) for review/feedback before submitting to R-Core/Bugzilla. This can help with checking that you have included the important information and excluded redundant information. If your patch has not received any notice from reviewers (i.e., no comment made) after one month, comment/message on the #patches-for-review channel to remind the members that the patch needs a review. When someone does manage to find the time to look at your patch they will most likely make comments about how it can be improved. It is then expected that you update your patch to address these comments, and the review process will thus iterate until a satisfactory solution has emerged. 7.7.1 How to review a patch? One of the bottlenecks in the R development process is the lack of code reviews. If you browse Bugzilla, you will see that numerous issues have a fix, but cannot be merged into the main source code repository, because no one has reviewed the proposed solution. Reviewing a patch can be just as informative as providing a patch and it will allow you to give constructive comments on another developer’s work. This guide provides a checklist for submitting a patch review. It is a common misconception that in order to be useful, a patch review has to be perfect. This is not the case at all. It is helpful to just test the patch and/or play around with the code and leave comments in the patch or on Bugzilla. If a bug report or an issue has a patch attached that has not been reviewed, you can help by making sure that the patch: follows the style guides; is a good solution to the problem it is trying to solve; includes proper tests; and includes proper documentation changes. Also refer to Making good patches for more ideas. Doing all of this allows the core developer(s) and/ or maintainer(s) to more quickly look for subtle issues that only people with extensive experience working on R’s codebase will notice. 7.8 Leaving a patch review on Bugzilla When you review a patch, you should provide additional details and context of your review process and leave comments. For example: If you tested the patch, report the result and the system and version tested on, such as ‘Windows 10’, ‘Ubuntu 16.4’, or ‘Mac High Sierra’. If you request changes, try to suggest how or attach an updated patch. Comment on what is ‘good’ about the patch, not just the ‘bad’. Doing so will make it easier for the patch author to find the good in your comments. 7.9 Dismissing review from another core developer A core developer can dismiss another core developer’s review if they confirmed that the requested changes have been made. When a core developer has assigned the patch to themselves, then it is a sign that they are actively looking after the patch, and their review should not be dismissed. 7.10 Acceptance or rejection of your patch Once your patch has reached an acceptable state, it will either be applied or rejected. If it is rejected, please do not take it personally. Your work is still appreciated regardless of whether your patch is applied. Balancing what does and does not go into R is tricky and everyone’s contributions cannot always be accepted. But if your patch is accepted and applied it will then go on to be released with the next patched release and eventually the next major release of R. It may also be backported to older versions of R as a bugfix if the core developer doing the patch acceptance believes it is warranted. It may take longer before your patch is accepted and applied or rejected, sometimes even months or years. Nonetheless, it is appreciated that you submitted a patch. 7.11 Examples of patch reports on Bugzilla 7.12 Examples of reviewing a patch 7.13 See also Submitting patches "],["Doc.html", "Chapter 8 Documenting 8.1 Guidelines for writing R help files 8.2 R manuals 8.3 Helping with documentation 8.4 Proofreading 8.5 Helping with the Developer’s Guide 8.6 Reporting documentation bugs 8.7 See also", " Chapter 8 Documenting R has a substantial body of documentation, comprising help files for the core packages and a set of manuals aimed at users (An Introduction to R, R Data Import/Export), system administrators (R Installation and Administration) and developers (Writing R Extensions, The R language definition, and R Internals). This documentation was developed by the R Core Team with input from external contributors. The continuing involvement of the user community is important in maintaining this valuable documentation. The involvement of the community takes many forms, from contributing content, to making bug reports or raising an issue when the documentation could be more complete or made easier to follow. This chapter is about the ways people can contribute to R’s documentation, with guidance on how to do that. Any time you feel that you can clarify or fill gaps in existing documentation, your contribution is welcome and appreciated. If you find it difficult to deal with the markup used in the source files, you can ask for help with that part too. Please do not let the material in this chapter stand between the documentation and your desire to help out. However, not every good faith effort to change or extend the documentation will be accepted - sometimes the suggested changes may be incorrect; other times, while a change in wording may make some things clearer and easier to understand, the finer details of some corner case may become less clear, leading to the suggested changes being declined or modified by a member of R Core before applying them (if they agree the issue is important enough to fix). 8.1 Guidelines for writing R help files The help files for R functions are written in ‘R documentation’ (.Rd) file format. It is a simple markup language with close resemblance to LaTeX. The .Rd file format can be further processed into a variety of formats, including LaTeX, HTML, and plain text. The .Rd files can be found in the man directory of the sources for the corresponding base package. For example, consider the mean.Rd file. % File src/library/base/man/mean.Rd % Part of the R package, https://www.R-project.org % Copyright 1995-2022 R Core Team % Distributed under GPL 2 or later \\name{mean} \\title{Arithmetic Mean} \\usage{ mean(x, \\dots) \\method{mean}{default}(x, trim = 0, na.rm = FALSE, \\dots) } \\alias{mean} \\alias{mean.default} \\arguments{ \\item{x}{An \\R object. Currently there are methods for numeric/logical vectors and \\link[=Dates]{date}, \\link{date-time} and \\link{time interval} objects. Complex vectors are allowed for \\code{trim = 0}, only.} \\item{trim}{the fraction (0 to 0.5) of observations to be trimmed from each end of \\code{x} before the mean is computed. Values of trim outside that range are taken as the nearest endpoint. } \\item{na.rm}{a logical evaluating to \\code{TRUE} or \\code{FALSE} indicating whether \\code{NA} values should be stripped before the computation proceeds.} \\item{\\dots}{further arguments passed to or from other methods.} } \\description{ Generic function for the (trimmed) arithmetic mean. } \\value{ If \\code{trim} is zero (the default), the arithmetic mean of the values in \\code{x} is computed, as a numeric or complex vector of length one. If \\code{x} is not logical (coerced to numeric), numeric (including integer) or complex, \\code{NA_real_} is returned, with a warning. If \\code{trim} is non-zero, a symmetrically trimmed mean is computed with a fraction of \\code{trim} observations deleted from each end before the mean is computed. } \\references{ Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) \\emph{The New S Language}. Wadsworth & Brooks/Cole. } \\seealso{ \\code{\\link{weighted.mean}}, \\code{\\link{mean.POSIXct}}, \\code{\\link{colMeans}} for row and column means. } \\examples{ x <- c(0:10, 50) xm <- mean(x) c(xm, mean(x, trim = 0.10)) } \\keyword{univar} Many authors of contributed R packages use the roxygen2 package to write documentation, which generates .Rd files from comments in the package .R files. However, the help files in the base distribution are maintained by directly editing the .Rd files. This section gives an overview of the .Rd format and summarises the guidelines for writing the R help files. The guidelines are intended for contributors to base R, but may also be useful for authors of contributed packages. Full documentation on writing R documentation files can be found in the Writing R Extensions manual. There are three main parts of an .Rd file: Header: This part is for the basic information of the document/file. For instance, the name of the file, the topics documented, a title, a short textual description, and R usage information for the objects documented. Body: This part includes further information on the function’s arguments and return value. Footer: This part is optional. Usually the keyword information is included here. All the above information is included in a .Rd file within a series of sections with standard names (user-defined sections are also allowed). These sections are discussed below: \\title section: Capitalize each word. Do not end in a period. Avoid use of markup language (because markup language need not be suitable for various hypertext search systems). \\usage and \\examples sections: Line length of 65 characters is advised. Use TRUE instead of T and FALSE instead of F. Add spaces around binary operators. Add spaces after commas in the argument lists. Use <- rather than = for assignments. Add spaces around the <- operator. Do not use tabs to indent (as these do not render correctly on all possible pagers). Use 4 spaces to indent the (example) code. Make sure the examples are directly executable. The examples should be system-independent. The examples should not require special facilities (for instance, Internet access or write permission to specific directories). Examples should also not take longer than necessary to run, as they are run when checking a build of R. \\source and \\references sections: Author(s) names should be written in the form Author, A. B.. Author(s) names should be separated by a comma or and (but not both). Separate paragraphs (separated by a blank line) should be used for each reference. Give a date immediately after the author(s) names. Do not put a period after the date. Titles of books and journals (not articles) should be enclosed in \\emph{...}. Volume numbers for journals are to be enclosed in \\bold{...} and followed by a comma. Use -- for page ranges. For giving an address for a publisher use the format New York: Springer-Verlag. The language used in the documentations should follow these basic rules: Affirmative tone should be used to describe what the function does and how to use it effectively. Rather than creating worry in the mind of a reader, it should establish confident knowledge about the effective use of the particular function/feature. More documentation is not necessarily better documentation. Long descriptions full of corner cases and caveats can create the impression that a function is more complex or harder to use than it actually is. Be succinct but exhaustive. Short code examples can help in understanding better. Readers can often grasp a simple example more quickly than they can digest a formal description. Usually people learn faster with concrete, motivating examples that match the context of a typical use case. Giving a code equivalent (or approximate equivalent) can be a useful addition to the description provided. You should carefully weigh whether the code equivalent adds value to the document. The tone of the documentation needs to be respectful of the reader’s background. Lay out the relevant information, show motivating use cases, provide glossary links, and do your best to connect-the-dots. The documentation is meant for newcomers, many of whom will be using it to evaluate the R language as a whole. The experience needs to be positive and not leave the reader with worries that something bad will happen if they make a mistake. Extensive details of writing R documentation files can be found here. 8.2 R manuals The R manuals are a part of the R sources. Hence, bug reports/patches can also be submitted via Bugzilla, e.g. Bug 15221 - R-admin/‘Installing R under Windows’: Missing argument name. Note that they are typically referred to by their file names as listed below: Manual Nickname An Introduction to R “R-intro” R Data Import/Export “R-data” R Installation and Administration “R-admin” Writing R Extensions “R-exts” The R language definition “R-lang” R Internals “R-ints” Note: Every manual is associated with a particular version of R, so you should check the version before reporting a bug. The R manuals page has links for the three types of release: r-release, r-patched and r-devel. These nicknames appear in the URLs, e.g. https://cran.r-project.org/doc/manuals/r-release/R-intro.html. The Texinfo manual should be referred to for how to mark up text. 8.3 Helping with documentation Maintaining the accuracy of R’s documentations and keeping a high level of quality takes a lot of effort. Community members, like you, help with writing, editing, and updating content, and these contributions are appreciated and welcomed. Looking at pre-existing documentation source files can be very helpful when getting started. You can directly search for documentation issues/bugs on Bugzilla. Issues vary from typos to unclear documentation and items lacking documentation. If you see a documentation issue that you would like to tackle, you can leave a comment on the issue saying you are going to try to solve the issue and mention roughly how long you think you will take to do so (this allows others to take on the issue if you happen to forget or lose interest). If you find some typo or problem on CRAN after checking the problem or typo you can write a polite email to cran-sysadmin@r-project.org and one of the R-core members working with CRAN. You’ll probably get a prompt reply about how the issue is going to be fixed. 8.4 Proofreading While an issue filed on Bugzilla means there is a known issue somewhere, that does not mean there are not other issues lurking about in the documentation. Proofreading a part of the documentation can often uncover problems. If you decide to proofread, read a section of the documentation from start to finish, filing issues in Bugzilla for each major type of problem you find. It is best to avoid filing a single issue for an entire section containing multiple problems; instead, file several issues so that it is easier to break the work up for multiple people and more efficient review. 8.5 Helping with the Developer’s Guide The Developer’s Guide (what you are reading now) uses the same process as the main R documentation, except for some small differences. The source lives in a GitHub repository and bug reports should be submitted to the devguide GitHub tracker. Our dev guide workflow uses continuous integration and deployment so changes to the dev guide are normally published when the pull request is merged. How to contribute to this guide from the introduction. 8.6 Reporting documentation bugs If you find some typo or problem on the CRAN webpages you can write a polite email to CRAN@r-project.org to report it. As an alternative, one can also write to the R-devel mailing list or submit a bug report via R’s Bugzilla. For improvements of the R-manuals or reporting typos or bugs in the R-manuals, submit a bug report to R’s Bugzilla. For reporting bugs or typos on the webpages or documentation about a particular package, write to the corresponding package maintainer. To find the maintainer of a package, use the command maintainer(\"package-name\"). Note: There is a #core-documentation channel on the R Contributors slack where you can discuss about the patches for improvements to R’s documentation. 8.7 See also Writing R documentation files "],["message-translations.html", "Chapter 9 Message Translations 9.1 How translations work 9.2 How to contribute new translations 9.3 Current status of translations in R 9.4 Helpful references", " Chapter 9 Message Translations This chapter covers internationalization in R, i.e., the display of messages in languages other than English. All output in R (such as messages emitted by stop(), warning(), or message()) is eligible for translation, as are menu labels in the GUI. Depending on the version of R that you are using, some of the languages might already be available while others may need work. R leverages the gettext program to handle the conversion from English to arbitrary target languages. Having messages available in other languages can be an important bridge for R learners not confident in English – rather than learning two things at once (coding in R and processing diagnostic information in English), they can focus on coding while getting more natural errors/warnings in their native tongue. The gettext manual is a more canonical reference for a deep understanding of how gettext works. This chapter will just give a broad overview, with particular focus on how things work for R, with the goal of making it as low-friction as possible for developers and users to contribute new/updated translations. 9.1 How translations work Each of the default packages distributed with R (i.e., those found in ./src/library such as base, utils, and stats and which have priority base) contains a po directory. A po directory is the central location for ataloguing/translating each package’s messages. It contains a template message file (.pot) for the corresponding ackage along with translated .po files (that are created using the template .pot file). 9.1.1 .pot files A .pot file is a template file found inside the po directory of an R package. This template file is a snapshot of the messages available in a given domain. A domain in R typically identifies a source package and a source language (either R or C/C++). For example, the file R-stats.pot (found in the R sources in ./src/library/stats/po) is a catalogue of all messages produced by R code in the stats package, while stats.pot is a catalogue of all messages produced by C code in the stats package. The ‘base’ package has two exceptions to the basic pattern described above. The first is the domain for messages produced by the C code which is the fundamental backing of R itself (especially, but not exclusively, the C code under ./src/main[^The file ./po/POTFILES is the canonical source of files searched. Note that while, technically, it is possible to support translations in Fortran code, R does not currently do so. Only a handful of messages are produced by Fortran routines in the R sources.]). The associated .pot file is R.pot and is found in ./src/library/base/po. R-base.potis a normal.potfile because base has a normalR` directory. The second is the domain for the Windows R GUI, i.e., the text in the menus and elsewhere in the R GUI program available for running R on Windows. These messages are stored in the RGui.pot domain, also in the po directory for base, and are most commonly derived from C code found in ./src/gnuwin32. One reason to keep this domain separate is that it is only relevant to one platform (Windows). In particular, Windows has historically different character encodings, so that it made more sense for Windows developers to produce translations specifically or Windows, since it is non-trivial for non-Windows users to test their translations for the Windows GUI. 9.1.1.1 Generating .pot files For outside contributors, there’s no need to update .pot files – translators will typically take the R .pot files as given and generate .po files. These will be sent along to a language-specific translation maintainer, who then compiles them to send to the R Core developer responsible for translations, who finally applies them as a patch. To emphasize, this section is almost always not needed for contributing translations – it is here for completeness and edification. 9.1.2 .po files .po files are the most important artifacts for translators. They provide the (human-readable!) mapping between the messages as they appear in the source code and how the messages will appear to users in translated locales. 9.1.2.1 Singular messages Most messages appear as msgid/msgstr pairs. The former gives the message as it appears in the code, while the latter shows how it should appear in translation. For example, here is an error in German (locale: de) informing the user that their input must be of class POSIXt msgid "'to' must be a \\"POSIXt\\" object" msgstr "'to' muss ein \\"POSIXt\\" Objekt sein" See this in context in the R-de.po source file. The same message can also be found in R-it.po giving the translation to Italian: msgid "'to' must be a \\"POSIXt\\" object" msgstr "'to' dev'essere un oggetto \\"POSIXt\\"" 9.1.2.2 Plural messages Some messages will have different translations depending on some input determined at run time (e.g., the length() of an input object or the nrow() of a data.frame). This presents a challenge for translation, because different languages have different rules for how to pluralize different ordinal numbers[^See the relevant section of the gettext manual]. For example, English typically adds s to any quantity of items besides 1 (1 dog, 2 dogs, 100 dogs, even 0 dogs). Chinese typically does not alter the word itself in similar situations (一只狗, 两只狗, 一百只狗, 零只狗); Arabic has six different ways to pluralize a quantity. In .po files, this shows up in the form of msgid_plural entries, followed by several ordered msgstr entries. Here’s an example from R-de.po5: msgid "Warning message:\\n" msgid_plural "Warning messages:\\n" msgstr[0] "Warnmeldung:\\n" msgstr[1] "Warnmeldungen:\\n" The two entries in English correspond to the singular and plural messages; the two entries in German correspond similarly, because pluralization rules in German are similar to those in English. The situation in Lithuanian (R-lt.po) is more divergent: msgid "Warning message:\\n" msgid_plural "Warning messages:\\n" msgstr[0] "Įspėjantis pranešimas:\\n" msgstr[1] "Įspėjantys pranešimai:\\n" msgstr[2] "Įspėjančių pranešimų:\\n" This corresponds to the 3 different ways to pluralize words in Polish. What do 0, 1, and 2 correspond to, exactly? Ideally, this will be clear to native speakers of the language, but for clarity, it is the solution to a small arithmetic problem that can be found in the language’s metadata entry. Look for the Plural-Forms entry in the metadata at the top of the .po file; here it is for Lithuanian: "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\\n" nplurals tells us how many entries correspond to each msgid_plural for this language. plural tells us, for the quantity n, which entry to use. The arithmetic is C code; most important if you really want to parse this and are only familiar with R code is C’s ternary operator: test ? valueIfTrue : valueIfFalse is a handy way to write R’s if (test) valueIfTrue else valueIfFalse. Parsing, we get the following associations: the 0 entry corresponds to when a number equals 1 modulo 10 (i.e., 1, 11, 21, 31, …) except numbers equaling 11 modulo 100 (i.e., 11, 111, 211, 311, …). Combining, that’s 1, 21, 31, …, 91, 101, 121, 131, …, 191, … the 1 entry corresponds to numbers at least 2 modulo 10 (2, 3, …, 8, 9, 12, 13, 14, …) and either below 10 modulo 100 (0, 1, …, 9, 100, 101, …, 109, …) or exceeding 20 modulo 100 (21, 22, …, 99). Combining, that’s 2, 3, …, 9, 22, 23, …, 29, 32, 33, … 39, …, 102, 103, …, 109, 122, 123, … The 2 entry corresponds to all other numbers, i.e. 0, 10, 11, 12, …, 19, 20, 30, …, 90, 100, 110, 111, 112, … 9.1.3 .mo files .po files are plain text, but while helpful for human readers, this is inefficient for consumption by computers. The .mo format is a “compiled” version of the .po file optimized for retrieving messages when R is running. In R-devel, the conversion from .po to .mo is done by R Core – you don’t need to compile these files yourself. They are stored in the R sources at ./src/library/translations/inst in various language-specific subdirectories. 9.2 How to contribute new translations Translating R into different languages helps make it more user-friendly for non-English speakers and helps to grow the R community. See the blog post on how R can use your help: Translating R messages. To get started contributing to translations, please follow the steps below: Step 1: Register an Account at Weblate Weblate is an open-source platform for collaborative translation of software projects. Register an account on R’s Weblate server, https://translate.rx.studio/, to start contributing. Note: To get started follow the detailed workflow and convention for translation which is given here: https://contributor.r-project.org/translations/ Step 2: Choose a Component and Language Select a component of R with less than 100% translation. Each component corresponds to the messages in either the R code or the C code of one of the packages in base R, e.g. base (R files), or tools (C files). There is one special case: base (R GUI), which corresponds to the messages in the Windows Graphical User Interface. After selecting a component, you can select your preferred language. Step 3: Translate the Message Now, you can click on Translate button on your right. Note: More information for String status visit: https://docs.weblate.org/en/latest/workflows.html#translation-states Then, start translating the message by typing the translation in the text box. If you are confident that the translation is correct, make sure the “Needs editing” box is unchecked. If you are unsure about how to translate, write the translation as a Suggest button instead. Finally, Click “Save and Continue” to save the translation and continue. Note: Use Glossary feature within Weblate making translation easy and consistent: https://translate.rx.studio/projects/r-project/glossary/ Note: Make sure to use Automatic Suggestions as a starting point. Click on Automatic Suggestions (machine translation) Accept it if you think the automatic suggestion looks good Some Tips to follow: Be consistent: Use the same words and phrases throughout the translation to make it consistent and avoid confusion. Check for technical issues: After finishing the translation, check if you have any alerts or warning in the Weblate string status, e.g. double instead of single space. Follow language specific guidelines: Check how other languages have translated the string. Even if you are not fluent in another language it can give you an idea of how other translators have handled it, especially which parts are left verbatim. A detailed guide is given here : Conventions-for-translations#languages-and-contributions Related links: https://contributor.r-project.org/tutorials/translating-r-to-your-language/ 9.3 Current status of translations in R https://contributor.r-project.org/translations-dashboard/ 9.4 Helpful references Statistical terms glossary The GitHub mirror of the actual svn repo is linked in this chapter as it is a better interface for browsing the source files.↩︎ "],["TestRVer.html", "Chapter 10 Testing Pre-release R Versions 10.1 Where to test? 10.2 What can you test? 10.3 Writing tests for R 10.4 Benchmarks", " Chapter 10 Testing Pre-release R Versions This chapter is inspired from the blog on testing R before release and discusses how you can help with testing of pre-release versions of R. 10.1 Where to test? Whenever possible use a fresh package library for testing, even better would be to use virtual machines for the testing. This would ensure that you do not damage your existing R installation. 10.1.1 Virtual machine A free Windows 10 virtual machine is provided by Microsoft (with a 90-day limit) for building, testing, and checking R packages and R itself. Package maintainers who work on Linux and MacOS can use it to test their packages on Windows. Read the instructions on how to automatically set up the machine to check R packages. Tomas Kalibera describes the details of using virtual machine in the blog Virtual Windows machine for checking R packages. 10.2 What can you test? You can test: Your own programs. Your own workflows. Your special ways of installing or setting up R. Things that interact with external libraries. Interactive R packages. Details of performing testing on various operating systems: Windows macOS Linux Solaris 10.3 Writing tests for R Writing tests for R is much like writing tests for your own code. Tests need to be thorough, fast, isolated, consistently repeatable, and as simple as possible. When you are adding tests to an existing test file, it is also recommended that you study the other tests in that file; it will teach you which precautions you have to take to make your tests robust and portable. We try to have tests both for normal behaviour and for error conditions. Tests live in the tests directory. 10.4 Benchmarks Benchmarking is useful to test that a change does not degrade performance. "],["CoreDev.html", "Chapter 11 R Core Developers", " Chapter 11 R Core Developers This page lists the former and current members of the R Core team who have write access to the R source. Brian Ripley (present) Deepayan Sarkar (present) Douglas Bates (present) Duncan Murdoch (up to September 2017) Duncan Temple Lang (present) Friedrich Leisch (present) Guido Masarotto (up to June 2003) Heiner Schwarte (up to October 1999) John Chambers (present) Kurt Hornik (present) Luke Tierney (present) Martin Maechler (present) Sebastian Meyer (present) Martin Morgan (up to June 2021) Martyn Plummer (present) Michael Lawrence (present) Paul Murrell (present) Peter Dalgaard (present) Robert Gentleman (present) Ross Ihaka (present) Seth Falcon (up to August 2015) Simon Urbanek (present) Stefano lacus (up to July 2014) Thomas Lumley (present) Tomas Kalibera (present) Uwe Ligges (present) View the affiliations of R Core members. We’ve left it up to the individual core developers to list areas of expertise (or things they are willing to maintain) if they wish. The Contributors page on the R Project website also lists contributors, outside the R Core team, who provided invaluable help by donating code, bug fixes, and documentation. "],["WhereToGetHelp.html", "Chapter 12 Where to Get Help 12.1 Slack 12.2 Mailing lists 12.3 File a bug", " Chapter 12 Where to Get Help If you are working on R it is possible that you will come across an issue where you would need some assistance to solve it. If you require help, there are options available to seek assistance or get some feedback which are discussed in this chapter. If the question involves process or tool usage then please check the rest of this guide first as it should answer your question. Please make sure to search the documentation and resources to see if your question has already been addressed. If not, then ask for assistance in the appropriate forum. Many developers are volunteers and please be polite, patient, and thoughtful when requesting for feedback or help. 12.1 Slack You can discuss issues related to the development of R and learn about the process of contributing to R on the R Contributors slack. There are a number of experienced developers on this slack who can answer questions and/or provide feedback. The following channels are available on the R-devel slack for help and feedback with specific areas: #bugreports-for-review: Share bug reports for review/feedback before submitting to Bugzilla. #core-dev-help: Getting help on anything related to R Core contribution. #core-documentation: Discuss patches/improvements to R’s documentation. #core-translation: Discuss translating R messages, warnings, and errors into non-English languages. #patches-for-review: Share patches for peer review before submitting to R Core. Note: You may not be able to access the history of these channels, so it cannot be used as a knowledge base of sorts. 12.2 Mailing lists There are quite a few mailing lists for getting help with R: R-devel: Questions and discussion about development of R vs. with R. Getting help with technical programming issues, e.g. interfacing R with C/C++. Proposals of new functionality for R. Pre-testing of new versions of R. Enhancements and patches to the R source code and the R documentation. Posting examples and benchmarks. R-help: Discussions about problems and solutions using R. R-package-devel: Getting help about package development in R. Learning about the package development process. Discussing problems developing a package (or problem in passing the R CMD check). Please avoid cross-posting to both the R-package-devel and the R-devel mailing lists. 12.3 File a bug If you strongly suspect you have come across a bug (be it in the build process, or in other areas), then report it on Bugzilla. "],["News.html", "Chapter 13 News and Announcements 13.1 Blogs 13.2 Conferences 13.3 Journal 13.4 Mailing lists 13.5 Twitter", " Chapter 13 News and Announcements Here are some resources that can be useful to keep up with the developments in R: 13.1 Blogs The R project maintains The R Blog with posts mainly written by the R Core Team. News of changes in the development version of R found on the Daily News about R-devel blog which is updated daily. 13.2 Conferences Updates about conferences actively supported or endorsed by The R Foundation can be found here. These conferences are organised by members from the R community. 13.3 Journal The R Journal is an open access and refereed journal featuring short to medium length articles that should be of interest to users or developers of R. It also has a news section where information on, changes in R (new features of the latest release), changes on CRAN (new add-on packages, manuals, binary contributions, mirrors, etc.), upcoming conferences, and conference reports is provided. 13.4 Mailing lists R-announce: A moderated mailing list used for announcements by the R Core Development Team. Major announcements about the development of R and the availability of new code are made here. R-packages: A moderated mailing list for announcements about contributed R packages (typically on CRAN) and similar R project extensions. 13.5 Twitter Follow @R_dev_news on Twitter for news of changes in the development version of R and new posts on The R Blog announcements. "],["DevTools.html", "Chapter 14 Developer Tools 14.1 Subversion (svn) client 14.2 Globally search for a regular expression and print matching lines (grep) 14.3 Git 14.4 GitHub", " Chapter 14 Developer Tools This chapter lists resources and tools which R developers may use. Here we will go over some commonly used tools that are relevant to R’s workflow. As there are several ways to accomplish these tasks, this chapter reflects methods suitable for new contributors. Experienced contributors may desire a different approach. 14.1 Subversion (svn) client Subversion (svn) is a version control system that tracks any changes made to files and directories. You can install either the TortoiseSVN (https://tortoisesvn.net/, command line tool, and Windows Explorer integration) or the SlikSVN (https://sliksvn.com/download/, just the command line tool) client. They have Windows installers and can be used from Windows cmd or RStudio terminal. Some resources for learning subversion commands: Apache Subversion quick start guide TortoiseSVN commands SlikSVN basics Subversion book 14.2 Globally search for a regular expression and print matching lines (grep) grep is a command line utility for searching plain text data sets for lines that match a regular expression. Refer the grep manual for more commands. 14.3 Git Git is also a version control system for tracking changes in any files and directories. View git documentation for learning git commands. 14.4 GitHub Some resources that are useful while using GitHub are: Creating a pull request Opening an issue from code Resolving a merge conflict on GitHub "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]]