knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
The main reason people switch from spreadsheet software such as Microsoft Excel to scripting languages such as Python and R is reproducibility, re-usability and the idea that code is an important means of communication.
Programming languages offer immense power. But with great power comes great responsibility. While analysis in code are less error prone to copy-and-paste errors as found in Excel and Co., or involuntary conversions to dates^[One study found that one 5th of screened genetics papers contained errors due to this behaviour in Excel. Source], they can of course contain mistakes nonetheless.
A number of measures have been taken to ensure that the code presented here is safe, testable and easy to extend.
R at it's heart is a functional programming language.
Loosely speaking, this means that functions are first
class citizens in this language. They can, for example,
be passed to other functions (higher order functions)
as arguments just like variables
However, it is not a strict functional language and
functions are not required to be pure, that
is free of side-effects. A pure function acts like
a mathematical function: When given the same input,
it produces the same output and does not rely
on any external, global state. I designed the functions
that process your data in ShinyLipids to be pure.
That means, if you put in the same data, rain of shine you
get the same processed data out.
Furthermore, this can guarantee that if some other part of ShinyLipids
changes or is being worked on, the way the pure functions
operate doesn't change.
Understanding and verifying one function does not require
you to read and understand the whole source code of all
other functions.
Of course, mistakes can still happen,
but the more the code aligns with conventions
of pure functional programming, the easier they are to
find and prevent.
But what if we do want to change things?
How can we make sure that ShinyLipids
still
works as a whole?
This is where unit tests come into play.
Because the functions mentioned above only rely on their input, we can also test and verify them as independent units. Furthermore, we can automate the whole process! Every time a code change is pushed online, a whole bunch of tests are run to make sure that the app still works, automatically.
DiagrammeR::grViz(diagram = "./dataflow.dot")
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.