The **R Function of the Day** series will focus on describing in *plain language* how certain R functions work, focusing on simple examples

that you can apply to gain insight into your own data.

Today, I will discuss the **foodweb** function, found in the mvbutils

package.

### Foodweb? What is that?

In biology, a foodweb is a group of food chains, showing the complex

relationships that exist in nature. Similarly, the R **foodweb**

function contained in the **mvbutils** package on CRAN displays a

flowchart of function calls. What functions does my function call?

What funtions in my package call the **lm** function? These are the

types of questions that can be answered in a graphical way using

**foodweb**. This information can be useful for documenting your own

code, and for learning how a package that you’re not familiar with

works. At the end of this post, you’ll see an example with a diagram

of the **survexp** function from the survival package.

First, you have to install and load the **mvbutils** package, so let’s

do that first.

install.packages("mvbutils") library(mvbutils)

### A simple example

Let’s define a couple simple functions to see how **foodweb** works. We

simply define a function called **outer** that calls two functions,

**inner1** and **inner2**.

inner1 <- function() { "This is the inner1 function" } inner2 <- function() { "This is the inner2 function" } outer <- function(x) { i1 <- inner1() i2 <- inner2() }

Now let’s use the foodweb function to diagram the relationship between

the outer and inner functions. If we don’t give **foodweb** any

arguments, it will scour our global workspace for functions, and make

the diagram. Since the only functions in my global workspace are the

ones we’ve just defined, we get the following plot.

foodweb()

We see a simple graph showing that the outer function calls both the

inner1 and inner2 functions, jus as we expect. We can make this look a

bit nicer by adjusting a few of the arguments.

foodweb(border = TRUE, expand.xbox = 3, boxcolor = "#FC6512", textcolor = "black", cex = 1.2, lwd=2)

You can see that you can control many of the graphical parameters of

the resulting plot. See the help page for **foodweb** to see the

complete list of graphical parameters you can specify.

### A more complicated example

As we saw above, by default **foodweb** will look in your global

workspace for functions to construct the web from. However, you can

pass **foodweb** a group of functions to operate on. There are several

ways of doing this, see the help page for examples. The code below

shows one possiblity, when we want to limit our results to functions

appearing in a specific package. The *prune* argument is very useful.

It takes a string (or regular expression) to prune the resulting graph

to.

foodweb(where = "package:survival", prune = "survexp", border = TRUE, expand.xbox = 2, boxcolor = "#FC6512", textcolor = "black", cex = 1.0, lwd=2) mtext("The survexp function foodweb")

### Conclusion

I have used the **foodweb** function to help understand other user’s

code that I have inherited. It has proved very valuable in aiding the

comprehension of hard to read or complicated functions. I have also

used it in the development of my own packages, as it sometimes can

suggest ways to reorganize the code to be more logical.