About
Why create {pkgdepR}
?
pkgdepR was created to solve a particular problem I had faced when developing interrelated R packages within organizations. Oftentimes, I would want to see (visually) how all the functions in one package interacted with all the functions in another package.
This was particularly useful in managing the function dependencies across a large code base of R packages.
How does {pkgdepR}
work?
pkgdepR simply takes as an argument a vector of package names (that should already be on the search path) and explores how each of the functions in each of the namespaces interact. It does this in two stages:
- Getting all intra-package function dependencies for each package;
and
- Getting all inter-package function dependencies for each combination of packages.
Each defined name in a particular package’s namespace that is also a
function is then decomposed. From this decomposition, if any function is
found to be called within its contents, then a link is created. To
properly identify distinct name calls, a search is done for a package
tag preceding the name (i.e. ::
). If no tag exists, then a
search for an imported function is conducted. On the other hand, if the
function name is already declared in the primary namespace, then it is
obviously that function being called.
If a function is ambiguously called (without a package tag or not being explicitly imported from another namespace) then it is deliberately ignored in the linkage. This is because the linkage would be environment-dependent and would change depending on the contents of the search path in that particular session.
S3 methods for {pkgdepR}
objects
The main wrapper function for pkgdepR is
pkgdepR::deps(...)
which returns an object of class
pkgdepR
. An S3 method has been created for objects of class
pkgdepR
so they can be easily plotted. See
?pkgdepR::plot.pkgdepR
for further details.
All implemented methods for this class are:
methods(class = "pkgdepR")
#> [1] plot print summary
#> see '?methods' for accessing help and source code
Installation
You can install the released version of pkgdepR from CRAN with:
install.packages("pkgdepR")
And the development version from GitHub with:
devtools::install_github("edpeyton/pkgdepR")
How to use
Here we’ll show an example of how to use pkgdepR using some test packages that are hosted on GitHub.
First, let’s load the required example packages.
The required packages have now been added to the search path.
Single package
Create a pkgdepR
object as follows:
v = pkgdepR::deps(pkg = "pkgdepR")
We can see a summary of the object
v # alternatively, summary(v) or print(v)
#>
#> pkgdepR object
#> ------------------------------
#> Packages: pkgdepR
#> Total nodes: 16
#> Total links: 17
#> -Between packages: 0
#> -Within packages: 17
#> --Between functions: 16
#> --Self-referential: 1
To see the network visualization, simply call plot.
Multiple packages
Visualizing multiple packages works in a similar way.
v # alternatively, summary(v) or print(v)
#>
#> pkgdepR object
#> ------------------------------
#> Packages: pkgdepR, magrittr
#> Total nodes: 64
#> Total links: 30
#> -Between packages: 6
#> -Within packages: 24
#> --Between functions: 23
#> --Self-referential: 1
It’s as simple as that!