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=