Learning Objectives

Following this assignment students should be able to:

  • use, modify, and write custom functions
  • use the output of one function as the input of another
  • understand and use the basic relational operators
  • use an if statement to evaluate conditionals


Lecture Notes

  1. Functions
  2. Conditionals


  1. Writing Functions (5 pts)

    Copy the following function into your assignment and replace the ________ with variables names for the input and output.

    convert_pounds_to_grams <- function(________) {
        grams = 453.6 * pounds

    Use the function to calculate how many grams there are in 3.75 pounds.

    Expected outputs for Writing Functions: 1
  2. Use and Modify (10 pts)

    The length of an organism is typically strongly correlated with its body mass. This is useful because it allows us to estimate the mass of an organism even if we only know its length. This relationship generally takes the form:

    mass = a * length^b

    Where the parameters a and b vary among groups. This allometric approach is regularly used to estimate the mass of dinosaurs since we cannot weigh something that is only preserved as bones.

    The following function estimates the mass of an organism in kg based on its length in meters for a particular set of parameter values, those for Theropoda (where a has been estimated as 0.73 and b has been estimated as 3.63; Seebacher 2001).

    get_mass_from_length_theropoda <- function(length){
      mass <- 0.73 * length ^ 3.63
    1. Use this function to print out the mass of a Spinosaurus that is 16 m long based on its reassembled skeleton.
    2. Create a new version of this function called get_mass_from_length() that estimates takes length, a and b as arguments and uses the following code to estimate the mass mass <- a * length ^ b. Use this function to estimate the mass of a Sauropoda (a = 214.44, b = 1.46) that is 26 m long.
    Expected outputs for Use and Modify: 1
  3. Combining Functions (10 pts)

    This is a follow up to Default Argument.

    Measuring things using the metric system is the standard approach for scientists, but when communicating your results more broadly it may be useful to use different units (at least in some countries). Write a function called convert_kg_to_pounds that converts kilograms into pounds (pounds = 2.205 * kg). Use that function and your get_mass_from_length() function from Default Arguments to estimate the weight, in pounds, of a 12 m long Stegosaurus with a = 10.95 and b = 2.64 (The estimated a and b values for Stegosauria from Seebacher 2001).

    Expected outputs for Combining Functions: 1
  4. Choice Operators (10 pts)

    Create the following variables.

    w <- 10.2
    x <- 1.3
    y <- 2.8
    z <- 17.5
    colors <- c("red", "blue", "green")
    masses <- c(45.2, 36.1, 27.8, 81.6, 42.4)
    dna1 <- "attattaggaccaca"
    dna2 <- "attattaggaacaca"

    Use them to print whether or not the following statements are TRUE or FALSE.

    1. w is greater than 10
    2. "green" is in colors
    3. x is greater than y
    4. Each value in masses is greater than 40.
    5. 2 * x + 0.2 is equal to y
    6. dna1 is the same as dna2
    7. dna1 is not the same as dna2
    8. w is greater than x, or y is greater than z
    9. x times w is between 13.2 and 13.5
    10. Each mass in masses is between 30 and 50.
    Expected outputs for Choice Operators: 1
  5. Simple If Statement (10 pts)

    To determine if a file named thesis_data.csv exists in your working directory you can use the code to get a list of available files and directories:

    1. Use the %in% operator to write a conditional statement that checks to see if thesis_data.csv is in this list.
    2. Write an if statement that loads the file using read.csv() only if the file exists.
    3. Add an else clause that prints “OMG MY THESIS DATA IS MISSING. NOOOO!!!!” if the file doesn’t exist.
    4. Make sure your actual thesis data is backed up.
    Expected outputs for Simple If Statement: 1
  6. Size Estimates by Name (20 pts)

    This is a follow up to Use and Modify.

    To make it even easier to work with your dinosaur size estimation functions you decide to create a function that lets you specify which dinosaur group you need to estimate the size of by name and then have the function automatically choose the right parameters.

    Create a new function get_mass_from_length_by_name() that takes two arguments, the length and the name of the dinosaur group. Inside this function use if/else if/else statements to check to see if the name is one of the following values and if so set a and b to the appropriate values.

    If the name is not any of these values set a and b to NA.

    Once the function has assigned a and b have it run get_mass_from_length() with the appropriate values and return the estimated mass.

    Run the function for:

    1. A Stegosauria that is 10 meters long.
    2. A Theropoda that is 8 meters long.
    3. A Sauropoda that is 12 meters long.
    4. A Ankylosauria that is 13 meters long.

    Challenge (optional): If the name is not one of values that have a and b values print out a message that it doesn’t know how to convert that group that includes that groups name in a message like “No known estimation for Ankylosauria”. (the function paste() will be helpful here). Doing this successfully will modify your answer to (4), which is fine

    Challenge (optional): Change your function so that it uses two different values of a and b for Stegosauria. When Stegosauria is greater than 8 meters long use the equation above. When it is less than 8 meters long use a = 8.5 and b = 2.8. Run the function for a Stegosauria that is 6 meters long.

    Expected outputs for Size Estimates by Name: 1
  7. DNA or RNA (15 pts)

    Write a function that determines if a sequence of base pairs is DNA, RNA, or if it is not possible to tell given the sequence provided. RNA has the base Uracil ("u") instead of the base Thymine ("t"), so sequences with u’s are RNA, sequences with t’s are DNA, and sequences with neither are unknown.

    You can check if a string contains a character (or a longer substring) in R using grepl(substring, string), so grepl("u", sequence) will check if the string in the sequence variable has the base u.

    Name the function dna_or_rna() and have it take sequence as an argument. Have the function return one of three outputs: "DNA", "RNA", or "UNKNOWN". Call the function on each of the following sequences.

    seq1 <- "ttgaatgccttacaactgatcattacacaggcggcatgaagcaaaaatatactgtgaaccaatgcaggcg"
    seq2 <- "gauuauuccccacaaagggagugggauuaggagcugcaucauuuacaagagcagaauguuucaaaugcau"
    seq3 <- "gaaagcaagaaaaggcaggcgaggaagggaagaagggggggaaacc"

    Challenge (optional): Figure out how to make your function work with both upper and lower case letters, or even strings with mixed capitalization.

    Expected outputs for DNA or RNA: 1
  8. Climate Space Rewrite (20 pts)

    This is a follow up to Climate Space.

    Producing a plot of occurrences on the available climate space for each of the three species required a lot of repetition of very similar code. Whenever this happens, it is usually an indication that a function could be used instead. Such functions reduce the repetition in producing the three species plots, which enables you to save time and prevent errors by not having to rewrite the same code multiple times.

    1. Create a function to download occurrence data and extract the corresponding climate data, which should return a dataset of all the bioclim variables for a single species. Because the latitude and longitude columns for each occurrence dataset have different names you can select and set them to the same name using the column index, instead of the column name, to get only those columns (e.g., select(longitude = 2, latitude = 3).

    2. Create a second function for plotting the occurrences for a single species onto the available climate space, then use this function to generate separate plots for each of the three tree species.

    Expected outputs for Climate Space Rewrite: 1 2 3

Assignment submission & checklist