{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<!--NAVIGATION-->\n",
    "< | [Main Contents](https://vectorbite.github.io/VBiTraining2/) | >"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Repeatable Analysis, Packages, and Function Design <span class=\"tocSkip\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc": true
   },
   "source": [
    "<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
    "<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Repeatable-Analysis\" data-toc-modified-id=\"Repeatable-Analysis-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>Repeatable Analysis</a></span><ul class=\"toc-item\"><li><span><a href=\"#No-one-else-will-do-my-analysis,-why-would-I-need-it-to-be-scripted?\" data-toc-modified-id=\"No-one-else-will-do-my-analysis,-why-would-I-need-it-to-be-scripted?-1.1\"><span class=\"toc-item-num\">1.1&nbsp;&nbsp;</span>No-one else will do my analysis, why would I need it to be scripted?</a></span></li><li><span><a href=\"#Switching-to-a-repeatable-process-is-easy!\" data-toc-modified-id=\"Switching-to-a-repeatable-process-is-easy!-1.2\"><span class=\"toc-item-num\">1.2&nbsp;&nbsp;</span>Switching to a repeatable process is easy!</a></span></li><li><span><a href=\"#A-change-in-thinking\" data-toc-modified-id=\"A-change-in-thinking-1.3\"><span class=\"toc-item-num\">1.3&nbsp;&nbsp;</span>A change in thinking</a></span></li><li><span><a href=\"#An-example-of-a-repeatable-script\" data-toc-modified-id=\"An-example-of-a-repeatable-script-1.4\"><span class=\"toc-item-num\">1.4&nbsp;&nbsp;</span>An example of a repeatable script</a></span></li><li><span><a href=\"#First-Task\" data-toc-modified-id=\"First-Task-1.5\"><span class=\"toc-item-num\">1.5&nbsp;&nbsp;</span>First Task</a></span></li></ul></li><li><span><a href=\"#Packages\" data-toc-modified-id=\"Packages-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>Packages</a></span><ul class=\"toc-item\"><li><span><a href=\"#The-multifunction-breadmaker\" data-toc-modified-id=\"The-multifunction-breadmaker-2.1\"><span class=\"toc-item-num\">2.1&nbsp;&nbsp;</span>The multifunction breadmaker</a></span></li><li><span><a href=\"#The-structure-of-an-R-package\" data-toc-modified-id=\"The-structure-of-an-R-package-2.2\"><span class=\"toc-item-num\">2.2&nbsp;&nbsp;</span>The structure of an R package</a></span></li></ul></li></ul></div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Repeatable Analysis"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "If we want someone to do a task in the same manner that we have, we can write them a list:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "1. Measure ingredients\n",
    "2. Mix ingredients\n",
    "3. Knead dough\n",
    "4. Leave to rise\n",
    "5. Form dough into a loaf\n",
    "6. Prove dough\n",
    "7. Bake dough"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Now this is all well and good, but we leave a lot of room for human error. How long do they mix for? How do they know when the bread is risen? All of these steps have places for deviation from the process we went through to make our loaf.\n",
    "\n",
    "Wouldn't it be easier if we could give the other person a way to perform the same task again and again in exactly the same way? In this case, let's give our other person a breadmaker with one button - **Make Good Bread**. Now the instrictions are as follows:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "1. Measure ingredients\n",
    "2. Empty into breadmaker\n",
    "3. Press **Make Good Bread** button"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "This process is *repeatable* and means that as long as the right ingredients are used in the right quantities, the result should be the same each time.\n",
    "\n",
    "We can apply the same thinking to our data handling and analysis steps as we work. Rather than telling others \"I did x, then I did y\" we can instead say \"Run the file `analysis_and_plot.R`\". As long as they have the same data, they will get the same graphs!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### No-one else will do my analysis, why would I need it to be scripted?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "There are some benefits to scripting your analysis even if you're only doing it for yourself. With a scripted workflow, we gain some major advantages for ourselves over running our R code line-by-line:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "- We know the loaded data will be in the right place, and will be clean from any changes we make later in the script\n",
    "- We won't accidentally run the same transformation twice on the same vector\n",
    "- We can design our analysis PRIOR to actually collecting our data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "I've seen many days wasted by people running R code interactively (though there is naturally a place for that). I personally believe that the last point above is the most important. If we know the form and structure of the data we WILL get once we return from field research, we can have a pipeline already in place so the analysis can be performed immediately!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### Switching to a repeatable process is easy!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Take a look at the following R code (here we will be using the inbuilt `iris` dataset distributed with R): **(FW: replace iris with actual VT data)**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "<thead><tr><th scope=col>Sepal.Length</th><th scope=col>Sepal.Width</th><th scope=col>Petal.Length</th><th scope=col>Petal.Width</th><th scope=col>Species</th></tr></thead>\n",
       "<tbody>\n",
       "\t<tr><td>5.1   </td><td>3.5   </td><td>1.4   </td><td>0.2   </td><td>setosa</td></tr>\n",
       "\t<tr><td>4.9   </td><td>3.0   </td><td>1.4   </td><td>0.2   </td><td>setosa</td></tr>\n",
       "\t<tr><td>4.7   </td><td>3.2   </td><td>1.3   </td><td>0.2   </td><td>setosa</td></tr>\n",
       "\t<tr><td>4.6   </td><td>3.1   </td><td>1.5   </td><td>0.2   </td><td>setosa</td></tr>\n",
       "\t<tr><td>5.0   </td><td>3.6   </td><td>1.4   </td><td>0.2   </td><td>setosa</td></tr>\n",
       "\t<tr><td>5.4   </td><td>3.9   </td><td>1.7   </td><td>0.4   </td><td>setosa</td></tr>\n",
       "</tbody>\n",
       "</table>\n"
      ],
      "text/latex": [
       "\\begin{tabular}{r|lllll}\n",
       " Sepal.Length & Sepal.Width & Petal.Length & Petal.Width & Species\\\\\n",
       "\\hline\n",
       "\t 5.1    & 3.5    & 1.4    & 0.2    & setosa\\\\\n",
       "\t 4.9    & 3.0    & 1.4    & 0.2    & setosa\\\\\n",
       "\t 4.7    & 3.2    & 1.3    & 0.2    & setosa\\\\\n",
       "\t 4.6    & 3.1    & 1.5    & 0.2    & setosa\\\\\n",
       "\t 5.0    & 3.6    & 1.4    & 0.2    & setosa\\\\\n",
       "\t 5.4    & 3.9    & 1.7    & 0.4    & setosa\\\\\n",
       "\\end{tabular}\n"
      ],
      "text/markdown": [
       "\n",
       "Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | \n",
       "|---|---|---|---|---|---|\n",
       "| 5.1    | 3.5    | 1.4    | 0.2    | setosa | \n",
       "| 4.9    | 3.0    | 1.4    | 0.2    | setosa | \n",
       "| 4.7    | 3.2    | 1.3    | 0.2    | setosa | \n",
       "| 4.6    | 3.1    | 1.5    | 0.2    | setosa | \n",
       "| 5.0    | 3.6    | 1.4    | 0.2    | setosa | \n",
       "| 5.4    | 3.9    | 1.7    | 0.4    | setosa | \n",
       "\n",
       "\n"
      ],
      "text/plain": [
       "  Sepal.Length Sepal.Width Petal.Length Petal.Width Species\n",
       "1 5.1          3.5         1.4          0.2         setosa \n",
       "2 4.9          3.0         1.4          0.2         setosa \n",
       "3 4.7          3.2         1.3          0.2         setosa \n",
       "4 4.6          3.1         1.5          0.2         setosa \n",
       "5 5.0          3.6         1.4          0.2         setosa \n",
       "6 5.4          3.9         1.7          0.4         setosa "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "head(iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "1.19933333333333"
      ],
      "text/latex": [
       "1.19933333333333"
      ],
      "text/markdown": [
       "1.19933333333333"
      ],
      "text/plain": [
       "[1] 1.199333"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Divide the sum of petal widths by the number of data entries to get the mean petal width\n",
    "petal_width_mean <- sum(iris$Petal.Width) / 150\n",
    "petal_width_mean"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "This obviously works fine for the iris dataset, which we can confirm by running the inbuilt mean function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "1.19933333333333"
      ],
      "text/latex": [
       "1.19933333333333"
      ],
      "text/markdown": [
       "1.19933333333333"
      ],
      "text/plain": [
       "[1] 1.199333"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "mean(iris$Petal.Width)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Now notice in our analogy at the top that there is still one place for things to go wrong: the ingredients. You cannot control what others try to put through your code. They may try to put a lobster in your breadmaker...or maybe cement. Either way they will not get the result they expected when the program is complete.\n",
    "\n",
    "So what happens if we try to run this on a different dataset, or in this case a subset?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "0.382"
      ],
      "text/latex": [
       "0.382"
      ],
      "text/markdown": [
       "0.382"
      ],
      "text/plain": [
       "[1] 0.382"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Sample 50 elements of the iris dataset randomly\n",
    "iris_new <- iris[sample(1:150, 50, replace = FALSE),]\n",
    "\n",
    "# Calculate mean as before\n",
    "new_petal_width_mean <- sum(iris_new$Petal.Width) / 150\n",
    "new_petal_width_mean"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "That doesn't look right! The mean of a randomly chosen subset should be similar to the mean of the original data. \n",
    "\n",
    "Let's check to see whether it's our calculation that's out:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "1.146"
      ],
      "text/latex": [
       "1.146"
      ],
      "text/markdown": [
       "1.146"
      ],
      "text/plain": [
       "[1] 1.146"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "mean(iris_new$Petal.Width)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Yeah that looks a lot more reasonable. But what went wrong?\n",
    "\n",
    "Can you see where the error may have arisen?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### A change in thinking"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "As I'm sure you spotted, our error was in using what is colloquially termed a *magic number*: **150**. We didn't consider for a second that the data running through our \"analysis\" was anything other than the data we were initially working with. As the mean is calculated by dividing the sum of the samples by the number of samples, and our original number of samples was 150, this didn't change when we changed the dataset.\n",
    "\n",
    "Let's fix this in a manner where it should never break again:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "1.146"
      ],
      "text/latex": [
       "1.146"
      ],
      "text/markdown": [
       "1.146"
      ],
      "text/plain": [
       "[1] 1.146"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "new_petal_width_mean <- sum(iris_new$Petal.Width) / nrow(iris_new)\n",
    "new_petal_width_mean"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "There we go! Much better.\n",
    "\n",
    "So now it works well for all datasets (technically this would break on a dataset with 0 rows in it, but let's ignore that for now). However each time we want to use our own homebrew mean function, we have to write it out and change the code again and again. This is a lot of effort and introduces the potential for fat-fingered typos. So let's change this into a function we can call again and again."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "1.19933333333333"
      ],
      "text/latex": [
       "1.19933333333333"
      ],
      "text/markdown": [
       "1.19933333333333"
      ],
      "text/plain": [
       "[1] 1.199333"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "1.146"
      ],
      "text/latex": [
       "1.146"
      ],
      "text/markdown": [
       "1.146"
      ],
      "text/plain": [
       "[1] 1.146"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "homebrew_pw_mean <- function(df){\n",
    "    return(sum(df$Petal.Width) / nrow(df))\n",
    "}\n",
    "homebrew_pw_mean(iris)\n",
    "homebrew_pw_mean(iris_new)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "This concept is called *genericisation*. Whilst not essential for repeatable analysis, generic functions are often good practice, make it easier to write similar code down the line, and are a vital part of packages (which we will address later)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### An example of a repeatable script"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Here I am going to provide you with a commented template for a repeatable analysis script. It won't actually do anything that we care about, but it gives you an idea of how to structure a script such that it should just be able to be run again and again."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "<thead><tr><th scope=col>Record.number</th><th scope=col>In.refID</th><th scope=col>IndividualID</th><th scope=col>Predator</th><th scope=col>Predator.common.name</th><th scope=col>Predator.taxon</th><th scope=col>Predator.lifestage</th><th scope=col>Type.of.feeding.interaction</th><th scope=col>Predator.mass</th><th scope=col>Prey</th><th scope=col>Prey.common.name</th><th scope=col>Prey.taxon</th><th scope=col>Prey.mass</th><th scope=col>Prey.mass.unit</th><th scope=col>Location</th></tr></thead>\n",
       "<tbody>\n",
       "\t<tr><td>1                            </td><td>ATSH063                      </td><td>1                            </td><td>Rhizoprionodon terraenovae   </td><td>Atlantic sharpnose shark     </td><td>ectotherm vertebrate         </td><td>adult                        </td><td>predacious/piscivorous       </td><td>1540.0                       </td><td>teleosts/molluscs/crustaceans</td><td>teleosts/molluscs/crustaceans</td><td>mixed                        </td><td>14.30                        </td><td>g                            </td><td>Apalachicola Bay, Florida    </td></tr>\n",
       "\t<tr><td>2                            </td><td>ATSH080                      </td><td>2                            </td><td>Rhizoprionodon terraenovae   </td><td>Atlantic sharpnose shark     </td><td>ectotherm vertebrate         </td><td>adult                        </td><td>predacious/piscivorous       </td><td>1600.0                       </td><td>teleosts/molluscs/crustaceans</td><td>teleosts/molluscs/crustaceans</td><td>mixed                        </td><td> 6.02                        </td><td>g                            </td><td>Apalachicola Bay, Florida    </td></tr>\n",
       "\t<tr><td>3                            </td><td>ATSH089                      </td><td>3                            </td><td>Rhizoprionodon terraenovae   </td><td>Atlantic sharpnose shark     </td><td>ectotherm vertebrate         </td><td>adult                        </td><td>predacious/piscivorous       </td><td>1840.0                       </td><td>teleosts/molluscs/crustaceans</td><td>teleosts/molluscs/crustaceans</td><td>mixed                        </td><td>11.90                        </td><td>g                            </td><td>Apalachicola Bay, Florida    </td></tr>\n",
       "\t<tr><td>4                            </td><td>ATSH143                      </td><td>4                            </td><td>Rhizoprionodon terraenovae   </td><td>Atlantic sharpnose shark     </td><td>ectotherm vertebrate         </td><td>adult                        </td><td>predacious/piscivorous       </td><td>  87.6                       </td><td>teleosts/molluscs/crustaceans</td><td>teleosts/molluscs/crustaceans</td><td>mixed                        </td><td> 8.12                        </td><td>g                            </td><td>Apalachicola Bay, Florida    </td></tr>\n",
       "\t<tr><td>5                            </td><td>ATSH161                      </td><td>5                            </td><td>Rhizoprionodon terraenovae   </td><td>Atlantic sharpnose shark     </td><td>ectotherm vertebrate         </td><td>adult                        </td><td>predacious/piscivorous       </td><td>  63.9                       </td><td>teleosts/molluscs/crustaceans</td><td>teleosts/molluscs/crustaceans</td><td>mixed                        </td><td> 6.56                        </td><td>g                            </td><td>Apalachicola Bay, Florida    </td></tr>\n",
       "\t<tr><td>6                            </td><td>ATSH166                      </td><td>6                            </td><td>Rhizoprionodon terraenovae   </td><td>Atlantic sharpnose shark     </td><td>ectotherm vertebrate         </td><td>adult                        </td><td>predacious/piscivorous       </td><td>  79.2                       </td><td>teleosts/molluscs/crustaceans</td><td>teleosts/molluscs/crustaceans</td><td>mixed                        </td><td> 5.41                        </td><td>g                            </td><td>Apalachicola Bay, Florida    </td></tr>\n",
       "</tbody>\n",
       "</table>\n"
      ],
      "text/latex": [
       "\\begin{tabular}{r|lllllllllllllll}\n",
       " Record.number & In.refID & IndividualID & Predator & Predator.common.name & Predator.taxon & Predator.lifestage & Type.of.feeding.interaction & Predator.mass & Prey & Prey.common.name & Prey.taxon & Prey.mass & Prey.mass.unit & Location\\\\\n",
       "\\hline\n",
       "\t 1                             & ATSH063                       & 1                             & Rhizoprionodon terraenovae    & Atlantic sharpnose shark      & ectotherm vertebrate          & adult                         & predacious/piscivorous        & 1540.0                        & teleosts/molluscs/crustaceans & teleosts/molluscs/crustaceans & mixed                         & 14.30                         & g                             & Apalachicola Bay, Florida    \\\\\n",
       "\t 2                             & ATSH080                       & 2                             & Rhizoprionodon terraenovae    & Atlantic sharpnose shark      & ectotherm vertebrate          & adult                         & predacious/piscivorous        & 1600.0                        & teleosts/molluscs/crustaceans & teleosts/molluscs/crustaceans & mixed                         &  6.02                         & g                             & Apalachicola Bay, Florida    \\\\\n",
       "\t 3                             & ATSH089                       & 3                             & Rhizoprionodon terraenovae    & Atlantic sharpnose shark      & ectotherm vertebrate          & adult                         & predacious/piscivorous        & 1840.0                        & teleosts/molluscs/crustaceans & teleosts/molluscs/crustaceans & mixed                         & 11.90                         & g                             & Apalachicola Bay, Florida    \\\\\n",
       "\t 4                             & ATSH143                       & 4                             & Rhizoprionodon terraenovae    & Atlantic sharpnose shark      & ectotherm vertebrate          & adult                         & predacious/piscivorous        &   87.6                        & teleosts/molluscs/crustaceans & teleosts/molluscs/crustaceans & mixed                         &  8.12                         & g                             & Apalachicola Bay, Florida    \\\\\n",
       "\t 5                             & ATSH161                       & 5                             & Rhizoprionodon terraenovae    & Atlantic sharpnose shark      & ectotherm vertebrate          & adult                         & predacious/piscivorous        &   63.9                        & teleosts/molluscs/crustaceans & teleosts/molluscs/crustaceans & mixed                         &  6.56                         & g                             & Apalachicola Bay, Florida    \\\\\n",
       "\t 6                             & ATSH166                       & 6                             & Rhizoprionodon terraenovae    & Atlantic sharpnose shark      & ectotherm vertebrate          & adult                         & predacious/piscivorous        &   79.2                        & teleosts/molluscs/crustaceans & teleosts/molluscs/crustaceans & mixed                         &  5.41                         & g                             & Apalachicola Bay, Florida    \\\\\n",
       "\\end{tabular}\n"
      ],
      "text/markdown": [
       "\n",
       "Record.number | In.refID | IndividualID | Predator | Predator.common.name | Predator.taxon | Predator.lifestage | Type.of.feeding.interaction | Predator.mass | Prey | Prey.common.name | Prey.taxon | Prey.mass | Prey.mass.unit | Location | \n",
       "|---|---|---|---|---|---|\n",
       "| 1                             | ATSH063                       | 1                             | Rhizoprionodon terraenovae    | Atlantic sharpnose shark      | ectotherm vertebrate          | adult                         | predacious/piscivorous        | 1540.0                        | teleosts/molluscs/crustaceans | teleosts/molluscs/crustaceans | mixed                         | 14.30                         | g                             | Apalachicola Bay, Florida     | \n",
       "| 2                             | ATSH080                       | 2                             | Rhizoprionodon terraenovae    | Atlantic sharpnose shark      | ectotherm vertebrate          | adult                         | predacious/piscivorous        | 1600.0                        | teleosts/molluscs/crustaceans | teleosts/molluscs/crustaceans | mixed                         |  6.02                         | g                             | Apalachicola Bay, Florida     | \n",
       "| 3                             | ATSH089                       | 3                             | Rhizoprionodon terraenovae    | Atlantic sharpnose shark      | ectotherm vertebrate          | adult                         | predacious/piscivorous        | 1840.0                        | teleosts/molluscs/crustaceans | teleosts/molluscs/crustaceans | mixed                         | 11.90                         | g                             | Apalachicola Bay, Florida     | \n",
       "| 4                             | ATSH143                       | 4                             | Rhizoprionodon terraenovae    | Atlantic sharpnose shark      | ectotherm vertebrate          | adult                         | predacious/piscivorous        |   87.6                        | teleosts/molluscs/crustaceans | teleosts/molluscs/crustaceans | mixed                         |  8.12                         | g                             | Apalachicola Bay, Florida     | \n",
       "| 5                             | ATSH161                       | 5                             | Rhizoprionodon terraenovae    | Atlantic sharpnose shark      | ectotherm vertebrate          | adult                         | predacious/piscivorous        |   63.9                        | teleosts/molluscs/crustaceans | teleosts/molluscs/crustaceans | mixed                         |  6.56                         | g                             | Apalachicola Bay, Florida     | \n",
       "| 6                             | ATSH166                       | 6                             | Rhizoprionodon terraenovae    | Atlantic sharpnose shark      | ectotherm vertebrate          | adult                         | predacious/piscivorous        |   79.2                        | teleosts/molluscs/crustaceans | teleosts/molluscs/crustaceans | mixed                         |  5.41                         | g                             | Apalachicola Bay, Florida     | \n",
       "\n",
       "\n"
      ],
      "text/plain": [
       "  Record.number In.refID IndividualID Predator                  \n",
       "1 1             ATSH063  1            Rhizoprionodon terraenovae\n",
       "2 2             ATSH080  2            Rhizoprionodon terraenovae\n",
       "3 3             ATSH089  3            Rhizoprionodon terraenovae\n",
       "4 4             ATSH143  4            Rhizoprionodon terraenovae\n",
       "5 5             ATSH161  5            Rhizoprionodon terraenovae\n",
       "6 6             ATSH166  6            Rhizoprionodon terraenovae\n",
       "  Predator.common.name     Predator.taxon       Predator.lifestage\n",
       "1 Atlantic sharpnose shark ectotherm vertebrate adult             \n",
       "2 Atlantic sharpnose shark ectotherm vertebrate adult             \n",
       "3 Atlantic sharpnose shark ectotherm vertebrate adult             \n",
       "4 Atlantic sharpnose shark ectotherm vertebrate adult             \n",
       "5 Atlantic sharpnose shark ectotherm vertebrate adult             \n",
       "6 Atlantic sharpnose shark ectotherm vertebrate adult             \n",
       "  Type.of.feeding.interaction Predator.mass Prey                         \n",
       "1 predacious/piscivorous      1540.0        teleosts/molluscs/crustaceans\n",
       "2 predacious/piscivorous      1600.0        teleosts/molluscs/crustaceans\n",
       "3 predacious/piscivorous      1840.0        teleosts/molluscs/crustaceans\n",
       "4 predacious/piscivorous        87.6        teleosts/molluscs/crustaceans\n",
       "5 predacious/piscivorous        63.9        teleosts/molluscs/crustaceans\n",
       "6 predacious/piscivorous        79.2        teleosts/molluscs/crustaceans\n",
       "  Prey.common.name              Prey.taxon Prey.mass Prey.mass.unit\n",
       "1 teleosts/molluscs/crustaceans mixed      14.30     g             \n",
       "2 teleosts/molluscs/crustaceans mixed       6.02     g             \n",
       "3 teleosts/molluscs/crustaceans mixed      11.90     g             \n",
       "4 teleosts/molluscs/crustaceans mixed       8.12     g             \n",
       "5 teleosts/molluscs/crustaceans mixed       6.56     g             \n",
       "6 teleosts/molluscs/crustaceans mixed       5.41     g             \n",
       "  Location                 \n",
       "1 Apalachicola Bay, Florida\n",
       "2 Apalachicola Bay, Florida\n",
       "3 Apalachicola Bay, Florida\n",
       "4 Apalachicola Bay, Florida\n",
       "5 Apalachicola Bay, Florida\n",
       "6 Apalachicola Bay, Florida"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "<thead><tr><th scope=col>Predator</th><th scope=col>mean_mass</th></tr></thead>\n",
       "<tbody>\n",
       "\t<tr><td>Acanthocepola sp.       </td><td>  0.00912200            </td></tr>\n",
       "\t<tr><td>Ammodytes hexapterus    </td><td>  0.09127324            </td></tr>\n",
       "\t<tr><td>Anarhichas lupus        </td><td>  0.14158468            </td></tr>\n",
       "\t<tr><td>Anarhichas minor        </td><td>  0.22757436            </td></tr>\n",
       "\t<tr><td>Arnoglossus imperialis  </td><td> 19.30000000            </td></tr>\n",
       "\t<tr><td>Aspitrigla cuculus      </td><td>178.86250000            </td></tr>\n",
       "</tbody>\n",
       "</table>\n"
      ],
      "text/latex": [
       "\\begin{tabular}{r|ll}\n",
       " Predator & mean\\_mass\\\\\n",
       "\\hline\n",
       "\t Acanthocepola sp.        &   0.00912200            \\\\\n",
       "\t Ammodytes hexapterus     &   0.09127324            \\\\\n",
       "\t Anarhichas lupus         &   0.14158468            \\\\\n",
       "\t Anarhichas minor         &   0.22757436            \\\\\n",
       "\t Arnoglossus imperialis   &  19.30000000            \\\\\n",
       "\t Aspitrigla cuculus       & 178.86250000            \\\\\n",
       "\\end{tabular}\n"
      ],
      "text/markdown": [
       "\n",
       "Predator | mean_mass | \n",
       "|---|---|---|---|---|---|\n",
       "| Acanthocepola sp.        |   0.00912200             | \n",
       "| Ammodytes hexapterus     |   0.09127324             | \n",
       "| Anarhichas lupus         |   0.14158468             | \n",
       "| Anarhichas minor         |   0.22757436             | \n",
       "| Arnoglossus imperialis   |  19.30000000             | \n",
       "| Aspitrigla cuculus       | 178.86250000             | \n",
       "\n",
       "\n"
      ],
      "text/plain": [
       "  Predator                 mean_mass   \n",
       "1 Acanthocepola sp.          0.00912200\n",
       "2 Ammodytes hexapterus       0.09127324\n",
       "3 Anarhichas lupus           0.14158468\n",
       "4 Anarhichas minor           0.22757436\n",
       "5 Arnoglossus imperialis    19.30000000\n",
       "6 Aspitrigla cuculus       178.86250000"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAMAAADKOT/pAAADAFBMVEUAAAABAQECAgIDAwME\nBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUW\nFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJyco\nKCgpKSkqKiorKyssLCwtLS0uLi4vLy8wMDAxMTEyMjIzMzM0NDQ1NTU2NjY3Nzc4ODg5OTk6\nOjo7Ozs8PDw9PT0+Pj4/Pz9AQEBBQUFCQkJDQ0NERERFRUVGRkZHR0dISEhJSUlKSkpLS0tM\nTExNTU1OTk5PT09QUFBRUVFSUlJTU1NUVFRVVVVWVlZXV1dYWFhZWVlaWlpbW1tcXFxdXV1e\nXl5fX19gYGBhYWFiYmJjY2NkZGRlZWVmZmZnZ2doaGhpaWlqampra2tsbGxtbW1ubm5vb29w\ncHBxcXFycnJzc3N0dHR1dXV2dnZ3d3d4eHh5eXl6enp7e3t8fHx9fX1+fn5/f3+AgICBgYGC\ngoKDg4OEhISFhYWGhoaHh4eIiIiJiYmKioqLi4uMjIyNjY2Ojo6Pj4+QkJCRkZGSkpKTk5OU\nlJSVlZWWlpaXl5eYmJiZmZmampqbm5ucnJydnZ2enp6fn5+goKChoaGioqKjo6OkpKSlpaWm\npqanp6eoqKipqamqqqqrq6usrKytra2urq6vr6+wsLCxsbGysrKzs7O0tLS1tbW2tra3t7e4\nuLi5ubm6urq7u7u8vLy9vb2+vr6/v7/AwMDBwcHCwsLDw8PExMTFxcXGxsbHx8fIyMjJycnK\nysrLy8vMzMzNzc3Ozs7Pz8/Q0NDR0dHS0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc\n3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u\n7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz9/f3+/v7////i\nsF19AAAACXBIWXMAABJ0AAASdAHeZh94AAAgAElEQVR4nO3dd2AU1drH8WcTSOglgCBSRAUF\nrCAWEAFFUSQWlGKhiNgbKljAgooFsSNeFQUrImC/IIqKYKEpKgpIUZGezHvVi4pcKfNuSdky\n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",
      "text/plain": [
       "plot without title"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Clean the workspace to make sure nothing gets in the way\n",
    "rm(list=ls())\n",
    "\n",
    "# Load required packages using library or require\n",
    "library(ggplot2)\n",
    "library(dplyr)\n",
    "\n",
    "# Define functions we will use later\n",
    "generate_pred_mean_masses <- function(df){\n",
    "    pred_mean_mass <- df %>% group_by(Predator) %>% summarise(mean_mass = mean(Predator.mass))\n",
    "}\n",
    "\n",
    "# Load the data we are using, making sure to use RELATIVE PATHS\n",
    "df <- read.csv(\"../data/EcolArchives-E089-51-D1.csv\")\n",
    "\n",
    "# Note, I am only printing the top few entries in the datasets to show what is going on.\n",
    "# In general you only want to be printing in an analysis script when you have something useful to show (i.e. output statistics)\n",
    "# Don't just print for sanity checking in the final script as it can slow down a script significantly\n",
    "head(df)  \n",
    "\n",
    "# Perform data wrangling, generate useful measures, perform analysis etc.\n",
    "pred_mean_mass <- generate_pred_mean_masses(df)\n",
    "head(pred_mean_mass)\n",
    "\n",
    "# Do some sort of plotting\n",
    "p <- ggplot(data = df, aes(x = Predator.mass, y = Prey.mass)) + geom_point() + geom_smooth()\n",
    "# print(p)\n",
    "\n",
    "# Save outputs if needed.\n",
    "# pdf(\"testplot.pdf\")\n",
    "print(ggplot(data = df, aes(x = log(Prey.mass))) + geom_density())\n",
    "# dev.off()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### First Task"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Your first task, should you choose to accept it is to create your own repeatable analysis for some of the VecDyn/VecTraits data.\n",
    "\n",
    "This script should run from start to finish, only printing out results and graphs.\n",
    "\n",
    "This should be a relatively simple task for anyone fluent in R, but nonetheless it is good practice."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now of course, we could make this more generic, by making the script take the file to read as an argument from the command line. For now though we're going to leave repeatability alone and move on to the main focus for today: **Packages**."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "---\n",
    "## Packages"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Packages are something written by a better programmer to solve our problems so we don't have to, right?\n",
    "\n",
    "Well, kind of...\n",
    "But why can't **WE** be that \"better programmer\"?\n",
    "\n",
    "What makes them so special?\n",
    "\n",
    "The answer is nothing. Package designers are simply normal people who had a problem, solved it, and realised that they could help others do the same thing. What we're aiming to do today is to demystify packages and show that you can help countless people with not too much effort thanks to careful programming and a bit of foresight.\n",
    "\n",
    "<sub>Disclaimer: Some things about packages are a bit fiddly. I will not be held responsible for any loss of sanity or forehead damage to keyboards caused by looking at packages. Only use packages under parental supervision. Not suitable for ages 6 and above.</sub>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The multifunction breadmaker"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To extend the analogy I made at the start, packages are like a breadmaker with multiple functions. It helps you perform a certain task, but with plenty of flexibility within that task."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### The structure of an R package"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "An R package in its most basic form follows this structure:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "```\n",
    ". package_directory\n",
    "├── DESCRIPTION\n",
    "├── man\n",
    "│   └── stuff.Rd\n",
    "├── NAMESPACE\n",
    "└── R\n",
    "    └── stuff.R\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "The `DESCRIPTION` file contains the *important metadata about your package*. This includes the following information (though this is not by any means an exhaustive list):\n",
    "\n",
    "- Name\n",
    "- Title\n",
    "- Version\n",
    "- Description\n",
    "- Authors & Contributors\n",
    "- License\n",
    "- Dependencies (we will talk more about this one in a bit)\n",
    "\n",
    "The `NAMESPACE` file controls *how the functions you have created are available* to someone loading the package. Whilst this can be done by hand, it is often better to use a package like `roxygen2` to generate these for us. **(FW: Give example)**\n",
    "\n",
    "Finally the `R` directory contains the *main R code* of the package. This is where the real hard graft comes in when creating a package. We will be predominantly focusing on this section of the package today, looking at the elements and stylistic choices you should consider when writing functions for others to use."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "R",
   "language": "R",
   "name": "ir"
  },
  "language_info": {
   "codemirror_mode": "r",
   "file_extension": ".r",
   "mimetype": "text/x-r-source",
   "name": "R",
   "pygments_lexer": "r",
   "version": "3.4.4"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": false,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": true,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}