Using an R Package in an Ongoing Research
Contents
Using an R Package in an Ongoing Research¶
By: Naeem Khoshnevis
Last Update: July 06, 2022
This blog post addresses the need to use a modified version of R packages in ongoing research studies. Most of our packages and 90% of open source packages are rapidly underdevelopment. Although they have the core modules for the initial research, they might not be sufficient for conducting similar or completely different analyses. As a result, at some point, either you need some new features in the package, or you would like to see some modified version of the implemented functions. This post will go through best practices for handling these situations. There are two main scenarios with several subsections:
Asking for new features (you want the core developers (or any other open-source contributor) to implement it)
The changes are minor, or they fit in the current design.
The requested features may require some discussions, and you do not know where they fit.
Implementing new features
You do not plan on merging your code to the original code base.
You are not sure if you will merge the code to the original code base.
You plan on merging the code to the original code base.
The first category mainly deals with applied research, and the second category mostly happens with method research.
Asking for new features¶
We can divide the features based on their complexity, and wether it does fit in the current design or not.
Minor changes¶
The best place to request for minor changes is the issues
tab on the project repository. Although, opening an issue, opens doors for more discussions, it would be efficient if you put it in a user story format.
Note
User stories helps the developers to understand the feature. Here is a template:
As a (who wants to accomplish something)
I want to (what they want to accomplish)
So that (why they want to accomplish that thing)
Examples:
As a Macbook Pro user, I want to be able define max memory limit, so I am not constrained by limited memory on my system.
As a PBS system user, I want to be able to submit separate jobs for each exposure level, so I can ask for less memory during job submission.
Note: In scientific topics, it might not be easy to write the user stories in the exact format. Just try your best.
Major Enhancements¶
Significant enhancements require comprehensive discussions and sometimes revisions in the design. The best place to discuss these topics is the Discussions
tab. Just open a new discussion and discuss your idea. We suggest checking other discussions first. It might be an ongoing discussion, and you can contribute to it rather than starting a new discussion.
Implementing new features¶
Sometimes, you need to control the codebase, modify it, and debug it. In these situations, first, you need to make sure that the package license allows you to get the code, and also, you need to build some communication with the package developers. The extent of the communication depends on your final goal with the development. In the following, the extent of the communication is listed from low to high. Technical details are mentioned in the next section.
You do not plan on merging your code to the original code base¶
If you are 100% sure that you are not going to ask for help, or merge your code to the original codebase, you can just fork the project into your Github account and start modifying the code.
Warning
According to the GPLv3 license, on which most of our packages are based, you are obligated to share your code after modification, regardless of the status of merging the code to the original codebase.
You are not sure if you will merge the code to the original code base¶
Sometimes, you are working on a new idea, and you try to see if you can get better results or prove a concept. You are planning to merge your changes if you get acceptable results. In that case, you need to:
Follow the styling guides
Make sure you do not remove or modify the existing tests.
Make sure that your changes can pass old tests.
Closely track the developed branch and try to keep your branch updated as much as possible.
Keep your changes small and commit them with elaborate commit message.
Use new branches for subtasks.
Update NEWS.md file with each change.
You plan on merging the code to the original code base¶
In case you are working on one of the open issues, or you need significant support from the core developers in adding new features, or you are working on some features that you are convinced that it should be part of the original code base, Additional to the previously mentioned tasks:
Open an issue or a discussion if there isn’t one.
Attend the weekly meetings.
Technical Details¶
Regardless of your decision in merging the code, these are the steps to take:
Step 1: Fork the project into your Github account.
Step 2: Clone the repository into your local system.
Step 3: Click on the
.Rproj
file to open the project in RStudio.Step 4: Install
devtools
.install.packages("devtools")
Step 5: Modify your code.
Step 6: Load modified code.
devtools::load_all()
Step 7: Repeat steps 5 and 6.
Frequently Asked Questions¶
How can I make sure that the code passes all tests?
Run:
devtools::test()
How can I make sure that the code passes all checks?
Run:
devtools::check()
Where can I read more about these details?
R Packages book by Hadley Wickham and Jenny Bryan is the best source to learn more about R packaging.
I have changed the code and tested it; now I want to install it in another study; how can I make sure that I install the exact modified version?
The best way is to install it from Github. Each commit has a hash value that can be used to install the package. For example:
library(devtools) try(detach("package:CausalGPS", unload = TRUE), silent = TRUE) # if already you have the package, detach and unload it, to have a new install. install_github("fasrc/CausalGPS", ref="6b2b4d085eb53c5926f9deabe55da7d35c3b10aa") library(CausalGPS)
I need to add changes to one of the functions, as a result of those changes, the tests will fail, can I modify the tests?
Modifying the tests are not recommended. However, in case, you have no choice, please, comment out the origininal test, and add your new tests. Put the commented out tests and new tests in the following blocks.
## --- TODO: Commented out tests --- # Test 1 # Test 2 # ... # ---------------------------------- # --- TODO: Added tests ------------ Test 1a Test 2a # ... # ----------------------------------
I want to refactor the entire function, what are the best practices?
In the case of major refactoring, please duplicate the function and add a numerical suffix. However, you need to keep the git history. A simple copy and paste will remove the original file’s git history. To do that, let’s say you are on the
main
branch and you want to create a duplicate of thegenerate_pseudo_pop.R
file. You can follow these steps that mentioned here:
git checkout -b duplicate # create and checkout to duplicate branch git mv generate_pseudo_pop.R generate_pseudo_pop_1.R # Make the duplicate git commit -m "duplicate generate_pseudo_pop.R to generate_pseudo_pop_1.R" git checkout HEAD~ generate_pseudo_pop.R # Bring back the original file. git commit -m "restore the original file." git checkout main # Switch back to the main branch git merge --no-ff duplicate # merge duplicate into main branch.