Skip to content
Package: The R Code Optimizer
R Dockerfile
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Adding Code of conduct, and contributing Jun 19, 2019
Docker Edit on docker readme Aug 16, 2019
R DESCRIPTION with ' Jan 26, 2020
docs DESCRIPTION with ' Jan 26, 2020
inst Refactoring some code chunks Aug 1, 2019
man Styling, updating roxygen & pkgdown Jan 17, 2020
tests test OS dependant? Oct 4, 2019
vignettes Refactoring vignettes Aug 16, 2019
.Rbuildignore httr-oauth to ignore Aug 13, 2019
.covrignore Merging master Jul 23, 2019
.gitignore httr-oauth to ignore Aug 13, 2019
.travis.yml 💀 rco project skeleton May 27, 2019
CODE_OF_CONDUCT.md Updating Code of Conduct to v 1.4 Aug 8, 2019
DESCRIPTION
NAMESPACE written optimize_folder function Oct 4, 2019
NEWS.md Version bump to submit to CRAN Jan 19, 2020
README.Rmd Changing GSoC project url Jan 21, 2020
README.md Changing GSoC project url Jan 21, 2020
_pkgdown.yml Working on Loop-invariant Code Motion Jul 15, 2019
appveyor.yml
codecov.yml 💀 rco project skeleton May 27, 2019
rco.Rproj 🥇 First rco commit Mar 28, 2019

README.md

rco - The R Code Optimizer

lifecycle Travis build status AppVeyor build status Coverage status

Make your R code run faster! rco analyzes your code and applies different optimization strategies that return an R code that runs faster.

The rco project, from its start to version 1.0.0, was made possible by a Google Summer of Code 2019 project.

Thanks to the kind mentorship of Dr. Yihui Xie and Dr. Nicolás Wolovick.

Installation

rco is currently only available as a GitHub package.

To install it run the following from an R console:

if (!require("remotes")) {
  install.packages("remotes")
}
remotes::install_github("jcrodriguez1989/rco", dependencies = TRUE)

Usage

rco can be used in three ways:

  • Using the RStudio Addins

    1. Optimize active file: Optimizes the file currently open in RStudio. It will apply the optimizers present in all_optimizers.

    2. Optimize selection: Optimizes the code currently highlited in the RStudio Source Pane. It will apply the optimizers present in all_optimizers.

  • Using the shiny GUIs

    1. rco_gui("code_optimizer") opens a shiny interface in a browser. This GUI allows to easily optimize chunks of code.

    2. rco_gui("pkg_optimizer") opens a shiny interface in a browser. This GUI allows to easily optimize R packages that are hosted at CRAN or GitHub.

  • Using the R functions

    1. Optimize some .R code files
    optimize_files(c("file_to_optimize_1.R", "file_to_optimize_2.R"))
    1. Optimize some code in a character vector
    code <- paste(
      "code_to_optimize <- 8 ^ 8 * 1918",
      "cto <- code_to_optimize * 2",
      sep = "\n"
    )
    optimize_text(code)
    1. Optimize all .R code files into a folder
    optimize_folder("~/myfolder_to_optimize", recursive = FALSE)

Example

Suppose we have the following code:

code <- paste(
  "# I want to know my age in seconds!",
  "years_old <- 29",
  "days_old <- 365 * years_old # leap years don't exist",
  "hours_old <- 24 * days_old",
  "seconds_old <- 60 * 60 * hours_old",
  "",
  "if (seconds_old > 10e6) {",
  '  print("Whoa! More than a million seconds old, what a wise man!")',
  "} else {",
  '  print("Meh!")',
  "}",
  sep = "\n"
)

We can automatically optimize it by doing:

opt_code <- optimize_text(code, iterations = 1)
## Optimization number 1

## # I want to know my age in seconds!
## years_old <- 29
## days_old <- 365 * 29 # leap years don't exist
## hours_old <- 24 * days_old
## seconds_old <- 3600 * hours_old
## 
## if (seconds_old > 10e6) {
##   print("Whoa! More than a million seconds old, what a wise man!")
## } else {
##   print("Meh!")
## }

After one optimization pass we can see that it has only propagated the years_old variable. Another pass:

opt_code <- optimize_text(opt_code, iterations = 1)
## Optimization number 1

## # I want to know my age in seconds!
## years_old <- 29
## days_old <- 10585 # leap years don't exist
## hours_old <- 24 * 10585
## seconds_old <- 3600 * hours_old
## 
## if (seconds_old > 10e6) {
##   print("Whoa! More than a million seconds old, what a wise man!")
## } else {
##   print("Meh!")
## }

Now, it has folded the days_old variable, and then propagated it. Another pass:

opt_code <- optimize_text(opt_code, iterations = 1)
## Optimization number 1

## # I want to know my age in seconds!
## years_old <- 29
## days_old <- 10585 # leap years don't exist
## hours_old <- 254040
## seconds_old <- 3600 * 254040
## 
## if (seconds_old > 10e6) {
##   print("Whoa! More than a million seconds old, what a wise man!")
## } else {
##   print("Meh!")
## }

It has folded the hours_old variable, and then propagated it. Another pass:

opt_code <- optimize_text(opt_code, iterations = 1)
## Optimization number 1

## # I want to know my age in seconds!
## years_old <- 29
## days_old <- 10585 # leap years don't exist
## hours_old <- 254040
## seconds_old <- 914544000
## 
## if (914544000 > 10e6) {
##   print("Whoa! More than a million seconds old, what a wise man!")
## } else {
##   print("Meh!")
## }

It has folded the seconds_old variable, and then propagated it into the if condition. Another pass:

opt_code <- optimize_text(opt_code, iterations = 1)
## Optimization number 1

## # I want to know my age in seconds!
## years_old <- 29
## days_old <- 10585 # leap years don't exist
## hours_old <- 254040
## seconds_old <- 914544000
## 
## print("Whoa! More than a million seconds old, what a wise man!")

Now, it has folded the if condition, and as it was TRUE it just kept its body, as testing the condition or the else clause were dead code. So, optimize_text function has automatically detected constant variables, constant foldable operations, and dead code. And returned an optimized R code.

Guidelines for contributing

rco is an open source package, and the contributions to the development of the library are more than welcome. Please see our CONTRIBUTING.md file and “Contributing an Optimizer” article for detailed guidelines of how to contribute.

Code of Conduct

Please note that the ‘rco’ project is released with a Contributor Code of Conduct.

By contributing to this project, you agree to abide by its terms.

You can’t perform that action at this time.