Introduction

A function in R, just like a function in mathematics, can be thought of as a machine that takes inputs on one side, and returns a certain output on the other. The input is given as a set of (arguments), and the desired output is referred to as the (return value).

The syntax of calling a function also somewhat reminiscient of how we write function in standard mathematical notation, where the arguments appear in paranthesis after the function’s name. For instance:

sqrt(5)

Applies the function sqrt() (taking a square root) to the number 5.

To create a function in R we will use the following notation:

my_sum_fn <- function(arg1, arg2){
  total=arg1+arg2
  return(total)
}

Here, we used the command function() to create a function, and we placed two named arguments in the paranthesis, separated by a comma, to indicate that it takes two arguments which will be referred to, inside the function, as arg1 and arg2.

Below you will find some function exercsies alongside code that is used to test if they work properly.


Q1: The Square Maker

Create a function called square_it that takes one number and returns its square (\(x^2\)).

Self-Test:

result <- square_it(4)
if (result == 16) {
  print("✅ SUCCESS: 4 squared is indeed 16!")
} else {
  print(paste("❌ TRY AGAIN: Expected 16 but got:", result))
}
[1] "✅ SUCCESS: 4 squared is indeed 16!"

Question 2: The Greet User Function

Create a function called greet_user that takes one argument, name. It should return a string that says “Hello, [name]”. Use the build in “paste” function (you can learn more about it using the code: “?paste”)

Self-Test:

result <- greet_user("Sam")
if (identical(result, "Hello, Sam")) {
  print("✅ SUCCESS: You greeted Sam correctly!")
} else {
  print(paste("❌ TRY AGAIN: Expected 'Hello, Sam' but got:", result))
}
[1] "✅ SUCCESS: You greeted Sam correctly!"

Q3: Area of a Rectangle

Create calc_area which takes two arguments: length and width.

Self-Test:

result <- calc_area(5, 10)
if (result == 50) {
  print("✅ SUCCESS: Area calculation is correct!")
} else {
  print(paste("❌ TRY AGAIN: Expected 50 but got:", result))
}
[1] "✅ SUCCESS: Area calculation is correct!"

Q4: Celsius to Fahrenheit

Write a function c_to_f that converts Celsius to Fahrenheit. Formula: \(F = (C \times 1.8) + 32\)

Self-Test:

result <- c_to_f(0)
if (result == 32) {
  print("✅ SUCCESS: Freezing point (0C) is 32F!")
} else {
  print(paste("❌ TRY AGAIN: Expected 32 but got:", result))
}
[1] "✅ SUCCESS: Freezing point (0C) is 32F!"

Q5: Pass/Fail Logic

Create check_grade. If the input is 60 or higher, return “Pass”. Otherwise, return “Fail”. Notice! here you will need to use conditional statements. Some of the syntax is already appearing below

Self-Test:

res1 <- check_grade(85)
res2 <- check_grade(45)
if (res1 == "Pass" & res2 == "Fail") {
  print("✅ SUCCESS: The grader works perfectly!")
} else {
  print("❌ TRY AGAIN: Check your if/else logic.")
}
[1] "✅ SUCCESS: The grader works perfectly!"

Challenge 7: The Default Power Function

Create power_up with base and exponent. Follow the code below to give the exponent a default value of 2.

Self-Test:

res1 <- power_up(5) # Uses default (5^2)
res2 <- power_up(2, 3) # Uses manual (2^3)
if (res1 == 25 & res2 == 8) {
  print("✅ SUCCESS: Default values are working!")
} else {
  print("❌ TRY AGAIN: Check your function arguments and defaults.")
}
[1] "✅ SUCCESS: Default values are working!"

Q8: Vector Sum (The Final Boss)

Write sum_only_positives. It should take a vector of numbers and return the sum of only the numbers \(> 0\). Hint: (i) use a selection vector (see DataCamp), (ii) apply the build-in sum() function.

Self-Test:

result <- sum_only_positives(my_numbers)
if (result == 15) {
  print("✅ SUCCESS: You've mastered vectors and functions!")
} else {
  print(paste("❌ TRY AGAIN: Expected 15 but got:", result))
}
[1] "✅ SUCCESS: You've mastered vectors and functions!"
LS0tCnRpdGxlOiAiUHJhY3RpY2UgQXNzaWdubWVudDogV3JpdGluZyBGdW5jdGlvbnMgaW4gUiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBJbnRyb2R1Y3Rpb24KQSBmdW5jdGlvbiBpbiBSLCBqdXN0IGxpa2UgYSBmdW5jdGlvbiBpbiBtYXRoZW1hdGljcywgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSBtYWNoaW5lIHRoYXQgdGFrZXMgaW5wdXRzIG9uIG9uZSBzaWRlLCBhbmQgcmV0dXJucyBhIGNlcnRhaW4gb3V0cHV0IG9uIHRoZSBvdGhlci4gVGhlIGlucHV0IGlzIGdpdmVuIGFzIGEgc2V0IG9mICgqKmFyZ3VtZW50cyoqKSwgYW5kIHRoZSBkZXNpcmVkIG91dHB1dCBpcyByZWZlcnJlZCB0byBhcyB0aGUgKCoqcmV0dXJuIHZhbHVlKiopLgoKVGhlIHN5bnRheCBvZiBjYWxsaW5nIGEgZnVuY3Rpb24gYWxzbyBzb21ld2hhdCByZW1pbmlzY2llbnQgb2YgaG93IHdlIHdyaXRlIGZ1bmN0aW9uIGluIHN0YW5kYXJkIG1hdGhlbWF0aWNhbCBub3RhdGlvbiwgd2hlcmUgdGhlIGFyZ3VtZW50cyBhcHBlYXIgaW4gcGFyYW50aGVzaXMgYWZ0ZXIgdGhlIGZ1bmN0aW9uJ3MgbmFtZS4gRm9yIGluc3RhbmNlOgpgYGB7ciBjYWxsaW5nIGEgZnVuY3Rpb259CnNxcnQoNSkKYGBgCkFwcGxpZXMgdGhlIGZ1bmN0aW9uIHNxcnQoKSAodGFraW5nIGEgc3F1YXJlIHJvb3QpIHRvIHRoZSBudW1iZXIgNS4KClRvIGNyZWF0ZSBhIGZ1bmN0aW9uIGluIFIgd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZyBub3RhdGlvbjoKCmBgYHtyIGNyZWF0aW5nIGEgZnVuY3Rpb259Cm15X3N1bV9mbiA8LSBmdW5jdGlvbihhcmcxLCBhcmcyKXsKICB0b3RhbD1hcmcxK2FyZzIKICByZXR1cm4odG90YWwpCn0KYGBgCkhlcmUsIHdlIHVzZWQgdGhlIGNvbW1hbmQgZnVuY3Rpb24oKSB0byBjcmVhdGUgYSBmdW5jdGlvbiwgYW5kIHdlIHBsYWNlZCB0d28gbmFtZWQgYXJndW1lbnRzIGluIHRoZSBwYXJhbnRoZXNpcywgc2VwYXJhdGVkIGJ5IGEgY29tbWEsIHRvIGluZGljYXRlIHRoYXQgaXQgdGFrZXMgdHdvIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHJlZmVycmVkIHRvLCBpbnNpZGUgdGhlIGZ1bmN0aW9uLCBhcyBhcmcxIGFuZCBhcmcyLiAKCkJlbG93IHlvdSB3aWxsIGZpbmQgc29tZSBmdW5jdGlvbiBleGVyY3NpZXMgYWxvbmdzaWRlIGNvZGUgdGhhdCBpcyB1c2VkIHRvIHRlc3QgaWYgdGhleSB3b3JrIHByb3Blcmx5LgoKLS0tCgoKCiMjIFExOiBUaGUgU3F1YXJlIE1ha2VyCkNyZWF0ZSBhIGZ1bmN0aW9uIGNhbGxlZCBgc3F1YXJlX2l0YCB0aGF0IHRha2VzIG9uZSBudW1iZXIgYW5kIHJldHVybnMgaXRzIHNxdWFyZSAoJHheMiQpLgoKYGBge3J9CiMgWU9VUiBDT0RFIEhFUkU6CnNxdWFyZV9pdCA8LSBmdW5jdGlvbih4KSB7IHJldHVybih4XjIpIH0KYGBgCgoqKlNlbGYtVGVzdDoqKgpgYGB7cn0KcmVzdWx0IDwtIHNxdWFyZV9pdCg0KQppZiAocmVzdWx0ID09IDE2KSB7CiAgcHJpbnQoIuKchSBTVUNDRVNTOiA0IHNxdWFyZWQgaXMgaW5kZWVkIDE2ISIpCn0gZWxzZSB7CiAgcHJpbnQocGFzdGUoIuKdjCBUUlkgQUdBSU46IEV4cGVjdGVkIDE2IGJ1dCBnb3Q6IiwgcmVzdWx0KSkKfQpgYGAKCgoKIyMjIFF1ZXN0aW9uIDI6IFRoZSBHcmVldCBVc2VyIEZ1bmN0aW9uCkNyZWF0ZSBhIGZ1bmN0aW9uIGNhbGxlZCBgZ3JlZXRfdXNlcmAgdGhhdCB0YWtlcyBvbmUgYXJndW1lbnQsIGBuYW1lYC4gSXQgc2hvdWxkIHJldHVybiBhIHN0cmluZyB0aGF0IHNheXMgIkhlbGxvLCBbbmFtZV0iLiBVc2UgdGhlIGJ1aWxkIGluICJwYXN0ZSIgZnVuY3Rpb24gKHlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBpdCB1c2luZyB0aGUgY29kZTogIj9wYXN0ZSIpCiAKCmBgYHtyfQojIFlPVVIgQ09ERSBIRVJFOgpncmVldF91c2VyIDwtIGZ1bmN0aW9uKG5hbWUpIHsKICBwYXN0ZSgiSGVsbG8sIiwgbmFtZSkKfQpgYGAKCioqU2VsZi1UZXN0OioqCmBgYHtyfQojIFJ1biB0aGlzIHRvIGNoZWNrIHlvdXIgd29yawpyZXN1bHQgPC0gZ3JlZXRfdXNlcigiU2FtIikKaWYgKGlkZW50aWNhbChyZXN1bHQsICJIZWxsbywgU2FtIikpIHsKICBwcmludCgi4pyFIFNVQ0NFU1M6IFlvdSBncmVldGVkIFNhbSBjb3JyZWN0bHkhIikKfSBlbHNlIHsKICBwcmludChwYXN0ZSgi4p2MIFRSWSBBR0FJTjogRXhwZWN0ZWQgJ0hlbGxvLCBTYW0nIGJ1dCBnb3Q6IiwgcmVzdWx0KSkKfQpgYGAKCi0tLQoKCgojIyBRMzogQXJlYSBvZiBhIFJlY3RhbmdsZQpDcmVhdGUgYGNhbGNfYXJlYWAgd2hpY2ggdGFrZXMgdHdvIGFyZ3VtZW50czogYGxlbmd0aGAgYW5kIGB3aWR0aGAuCgoKCmBgYHtyfQojIFlPVVIgQ09ERSBIRVJFOgpjYWxjX2FyZWEgPC0gZnVuY3Rpb24obGVuZ3RoLCB3aWR0aCkgewogIHJldHVybihsZW5ndGggKiB3aWR0aCkKfQpgYGAKCioqU2VsZi1UZXN0OioqCmBgYHtyfQpyZXN1bHQgPC0gY2FsY19hcmVhKDUsIDEwKQppZiAocmVzdWx0ID09IDUwKSB7CiAgcHJpbnQoIuKchSBTVUNDRVNTOiBBcmVhIGNhbGN1bGF0aW9uIGlzIGNvcnJlY3QhIikKfSBlbHNlIHsKICBwcmludChwYXN0ZSgi4p2MIFRSWSBBR0FJTjogRXhwZWN0ZWQgNTAgYnV0IGdvdDoiLCByZXN1bHQpKQp9CmBgYAoKLS0tCgojIyBRNDogQ2Vsc2l1cyB0byBGYWhyZW5oZWl0CldyaXRlIGEgZnVuY3Rpb24gYGNfdG9fZmAgdGhhdCBjb252ZXJ0cyBDZWxzaXVzIHRvIEZhaHJlbmhlaXQuIApGb3JtdWxhOiAkRiA9IChDIFx0aW1lcyAxLjgpICsgMzIkCgpgYGB7cn0KIyBZT1VSIENPREUgSEVSRToKY190b19mIDwtIGZ1bmN0aW9uKEMpIHsKICByZXR1cm4oKEMgKiAxLjgpICsgMzIpCn0KYGBgCgoqKlNlbGYtVGVzdDoqKgpgYGB7cn0KcmVzdWx0IDwtIGNfdG9fZigwKQppZiAocmVzdWx0ID09IDMyKSB7CiAgcHJpbnQoIuKchSBTVUNDRVNTOiBGcmVlemluZyBwb2ludCAoMEMpIGlzIDMyRiEiKQp9IGVsc2UgewogIHByaW50KHBhc3RlKCLinYwgVFJZIEFHQUlOOiBFeHBlY3RlZCAzMiBidXQgZ290OiIsIHJlc3VsdCkpCn0KYGBgCgotLS0KCiMjIFE1OiBQYXNzL0ZhaWwgTG9naWMKQ3JlYXRlIGBjaGVja19ncmFkZWAuIElmIHRoZSBpbnB1dCBpcyAqKjYwIG9yIGhpZ2hlcioqLCByZXR1cm4gIlBhc3MiLiBPdGhlcndpc2UsIHJldHVybiAiRmFpbCIuCk5vdGljZSEgaGVyZSB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBjb25kaXRpb25hbCBzdGF0ZW1lbnRzLiBTb21lIG9mIHRoZSBzeW50YXggaXMgYWxyZWFkeSBhcHBlYXJpbmcgYmVsb3cKCgpgYGB7cn0KIyBZT1VSIENPREUgSEVSRToKY2hlY2tfZ3JhZGUgPC0gZnVuY3Rpb24oZ3JhZGUpIHsKICBpZihncmFkZSA+PSA2MCkgewogICAgcmV0dXJuKCJQYXNzIikKICB9IGVsc2UgewogICAgcmV0dXJuKCJGYWlsIikKICB9Cn0KYGBgCgoqKlNlbGYtVGVzdDoqKgpgYGB7cn0KcmVzMSA8LSBjaGVja19ncmFkZSg4NSkKcmVzMiA8LSBjaGVja19ncmFkZSg0NSkKaWYgKHJlczEgPT0gIlBhc3MiICYgcmVzMiA9PSAiRmFpbCIpIHsKICBwcmludCgi4pyFIFNVQ0NFU1M6IFRoZSBncmFkZXIgd29ya3MgcGVyZmVjdGx5ISIpCn0gZWxzZSB7CiAgcHJpbnQoIuKdjCBUUlkgQUdBSU46IENoZWNrIHlvdXIgaWYvZWxzZSBsb2dpYy4iKQp9CmBgYAoKCiMjIENoYWxsZW5nZSA3OiBUaGUgRGVmYXVsdCBQb3dlciBGdW5jdGlvbgpDcmVhdGUgYHBvd2VyX3VwYCB3aXRoIGBiYXNlYCBhbmQgYGV4cG9uZW50YC4gRm9sbG93IHRoZSBjb2RlIGJlbG93IHRvIGdpdmUgdGhlIGBleHBvbmVudGAgYSAqKmRlZmF1bHQgdmFsdWUqKiBvZiAyLgoKYGBge3J9CiMgWU9VUiBDT0RFIEhFUkU6CnBvd2VyX3VwIDwtIGZ1bmN0aW9uKGJhc2UsIGV4cG9uZW50ID0gMikgewogIHJldHVybihiYXNlIF4gZXhwb25lbnQpCn0KCmBgYAoKKipTZWxmLVRlc3Q6KioKYGBge3J9CnJlczEgPC0gcG93ZXJfdXAoNSkgIyBVc2VzIGRlZmF1bHQgKDVeMikKcmVzMiA8LSBwb3dlcl91cCgyLCAzKSAjIFVzZXMgbWFudWFsICgyXjMpCmlmIChyZXMxID09IDI1ICYgcmVzMiA9PSA4KSB7CiAgcHJpbnQoIuKchSBTVUNDRVNTOiBEZWZhdWx0IHZhbHVlcyBhcmUgd29ya2luZyEiKQp9IGVsc2UgewogIHByaW50KCLinYwgVFJZIEFHQUlOOiBDaGVjayB5b3VyIGZ1bmN0aW9uIGFyZ3VtZW50cyBhbmQgZGVmYXVsdHMuIikKfQpgYGAKCi0tLQoKIyMgUTg6IFZlY3RvciBTdW0gKFRoZSBGaW5hbCBCb3NzKQpXcml0ZSBgc3VtX29ubHlfcG9zaXRpdmVzYC4gSXQgc2hvdWxkIHRha2UgYSB2ZWN0b3Igb2YgbnVtYmVycyBhbmQgcmV0dXJuIHRoZSBzdW0gb2Ygb25seSB0aGUgbnVtYmVycyAkPiAwJC4gSGludDogKGkpIHVzZSBhIHNlbGVjdGlvbiB2ZWN0b3IgKHNlZSBEYXRhQ2FtcCksIChpaSkgYXBwbHkgdGhlIGJ1aWxkLWluIHN1bSgpIGZ1bmN0aW9uLgoKYGBge3J9CiMgWU9VUiBDT0RFIEhFUkU6CnN1bV9vbmx5X3Bvc2l0aXZlcyA8LSBmdW5jdGlvbihudW1iZXJzKSB7CiAgc3VtKG51bWJlcnNbbnVtYmVycyA+IDBdKQp9Cm15X251bWJlcnMgPC0gYygtMywgNSwgLTEsIDEwLCAwLCAtNykgCmBgYAoKKipTZWxmLVRlc3Q6KioKYGBge3J9Cm15X251bWJlcnMgPC0gYygtMTAsIDUsIC0yLCAxMCkKcmVzdWx0IDwtIHN1bV9vbmx5X3Bvc2l0aXZlcyhteV9udW1iZXJzKQppZiAocmVzdWx0ID09IDE1KSB7CiAgcHJpbnQoIuKchSBTVUNDRVNTOiBZb3UndmUgbWFzdGVyZWQgdmVjdG9ycyBhbmQgZnVuY3Rpb25zISIpCn0gZWxzZSB7CiAgcHJpbnQocGFzdGUoIuKdjCBUUlkgQUdBSU46IEV4cGVjdGVkIDE1IGJ1dCBnb3Q6IiwgcmVzdWx0KSkKfQpgYGA=