fastverse <img src='logo.png' width="350px" align="right" />
<!-- badges: start -->

<!--
[](https://codecov.io/gh/fastverse/fastverse?branch=master)
[](https://cran.r-project.org/) -->
<!-- badges: end -->
The fastverse is a suite of complementary high-performance packages for statistical computing and data manipulation in R. Developed independently by various people, fastverse packages jointly contribute to the objectives of:
- Speeding up R through heavy use of compiled (C/C++) code
- Enabling more complex statistical and data manipulation operations in R
- Reducing the number of dependencies required for advanced computing in R
The fastverse package is a meta-package providing utilities for easy installation, loading and management
of these packages. It is an extensible framework that allows users to create a 'verse' of packages suiting their general needs - see the vignette for a concise overview of the package.
<!-- *fastverse* packages are jointly attached with `library(fastverse)`, and several functions starting with `fastverse_` help manage dependencies, detect namespace conflicts, extend the *fastverse* and update packages. The [**vignette**](https://fastverse.github.io/fastverse/articles/fastverse_intro.html) provides a concise overview of the package. -->
Core Packages
The fastverse installs with 4 core packages (5 dependencies in total) which provide broad C/C++ based statistical and data manipulation functionality and have carefully managed APIs.
<!-- These packages are installed and attached along with the `fastverse` package. -->
-
data.table: Enhanced data frame class with concise data manipulation framework offering powerful aggregation, update, reshaping, (rolling) joins, rolling statistics, set operations on tables, fast csv read/write, and various utilities such as data transposition/stringsplit-transpose.
-
collapse: Fast grouped and weighted statistical computations, time series and panel data transformations, list-processing, data manipulation functions (incl. fast joins and pivots), summary statistics, and various utilities for efficient programming. Class-agnostic framework designed to work with vectors, matrices, data frames, lists and related classes including xts, data.table, tibble, and sf. <!-- *tsibble*, *tibbletime* -->
-
kit: Parallel (row-wise) statistical functions, vectorized and nested switches, and some utilities such as efficient partial sorting.
-
magrittr: Efficient pipe operators and aliases for enhanced R programming and code un-nesting.
Installation
<!--
Currently, there are 2 different versions of the *fastverse* on CRAN and GitHub/R-universe. The GitHub/R-universe version is recommended if you want to have *matrixStats* consistently preserve attributes of your matrices: it modifies functions in the *matrixStats* namespace making them preserve attributes consistently (and by default) whenever the *fastverse* is attached. This version was rejected by CRAN because it requires a call to `unlockBinding`. The CRAN version takes *matrixStats* as it is, which means most functions do not preserve attributes such as dimension names in computations.
-->
# Install the CRAN version
install.packages("fastverse")
# Install (Windows/Mac binaries) from R-universe
install.packages("fastverse", repos = "https://fastverse.r-universe.dev")
# Install from GitHub (requires compilation)
remotes::install_github("fastverse/fastverse")
<!--
*Note* that the GitHub/r-universe version is not a development version, development takes place in the 'development' branch.
*matrixStats* is slowly evolving towards greater consistency, but it might take more than half a year until dimension names are handled consistently by default - due to the large number of reverse dependencies. Until then CRAN and GitHub/R-universe versions of the *fastverse* are released together.
-->
Extending the fastverse
Users can, via the fastverse_extend() function, freely add packages. Setting permanent = TRUE adds them to the core fastverse. Another option is placing a .fastverse config file with packages in a project directory. Separate verses can be created with fastverse_child(). See the vignette for details.
<!--
<details>
<summary><b><a style="cursor: pointer;">Click here to expand </a></b> </summary>
<PRE class="fansi fansi-message"><code class="r"># Loads and attaches the core fastverse packages
library(fastverse)</code>
<CODE># -- <span style="font-weight: bold;">Attaching packages</span><span> --------------------------------------- </span><span style="color: #0087FF;">fastverse</span><span> 0.1.5 --
</span></CODE><CODE># <span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">data.table </span><span> 1.14.0 </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">collapse </span><span> 1.6.5
# </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">magrittr </span><span> 2.0.1 </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">matrixStats</span><span> 0.59.0
# </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">kit </span><span> 0.0.7 </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">fst </span><span> 0.9.4
</span></CODE>
<code class="r"># Permanently extends the core fastverse by certain packages
fastverse_extend(xts, roll, dygraphs, permanent = TRUE)</code>
<CODE># -- <span style="font-weight: bold;">Attaching extension packages</span><span> ----------------------------- </span><span style="color: #0087FF;">fastverse</span><span> 0.1.5 --
</span></CODE><CODE># <span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">xts </span><span> 0.12.1 </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">dygraphs</span><span> 1.1.1.6
# </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">roll </span><span> 1.1.6
</span></CODE><CODE># -- <span style="font-weight: bold;">Conflicts</span><span> ------------------------------------------ fastverse_conflicts() --
# </span><span style="color: #BB0000;">x</span><span> </span><span style="color: #0000BB;">xts</span><span>::</span><span style="color: #00BB00;">first()</span><span> masks </span><span style="color: #0000BB;">data.table</span><span>::first()
# </span><span style="color: #BB0000;">x</span><span> </span><span style="color: #0000BB;">xts</span><span>::</span><span style="color: #00BB00;">last()</span><span> masks </span><span style="color: #0000BB;">data.table</span><span>::last()
</span></CODE>
<code class="r"># If the fastverse is now loaded in a new session, these packages are added
fastverse_detach(session = TRUE)
library(fastverse)
</code><CODE># -- <span style="font-weight: bold;">Attaching packages</span><span> --------------------------------------- </span><span style="color: #0087FF;">fastverse</span><span> 0.1.5 --
</span></CODE><CODE># <span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">data.table </span><span> 1.14.0 </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">fst </span><span> 0.9.4
# </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">magrittr </span><span> 2.0.1 </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">xts </span><span> 0.12.1
# </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">kit </span><span> 0.0.7 </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">roll </span><span> 1.1.6
# </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">collapse </span><span> 1.6.5 </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">dygraphs </span><span> 1.1.1.6
# </span><span style="color: #0087FF;">v</span><span> </span><span style="color: #FF0087;">matrixStats</span><span> 0.59.0
</span></CODE><CODE># -- <span style="font-weight: bold;">Conflicts</span><span> ------------------------------------------ fastverse_conflicts() --
# </span><span style="color: #BB0000;">x</span><span> </span