Chapter 19: R Nested If
Part 1: What Are Nested If Statements?
A nested if statement is simply an if statement placed inside another if statement. It allows you to test multiple conditions in a hierarchical way, where the inner condition is only evaluated if the outer condition is true.
The Basic Building Blocks
Before diving into nesting, let’s review the basic if structure in R:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment"># Simple if statement</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>condition<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># code to execute if condition is TRUE</span> <span class="token punctuation">}</span> <span class="token comment"># if-else statement</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>condition<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># code if condition is TRUE</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment"># code if condition is FALSE</span> <span class="token punctuation">}</span> |
The Nested Structure
A nested if looks like this:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<span class="token keyword">if</span> <span class="token punctuation">(</span>outer_condition<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Code executed if outer_condition is TRUE</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>inner_condition<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Code executed if both conditions are TRUE</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment"># Code executed if outer is TRUE but inner is FALSE</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment"># Code executed if outer_condition is FALSE</span> <span class="token punctuation">}</span> |
Notice how the second if statement sits completely inside the first if block, with its own indentation showing it belongs to the outer condition.
Part 2: Simple Examples to Build Understanding
Let’s start with a straightforward example to see nesting in action:
Example 1: Number Classification
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
x <span class="token operator"><-</span> <span class="token number">30</span> <span class="token comment"># First if block</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"x is greater than ten"</span><span class="token punctuation">)</span> <span class="token comment"># Second if block (nested)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">20</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"and also greater than 20!"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"but less than 20."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Closing the first if block</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"x is less than or equal to 10."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
What happens here:
-
R checks if
x > 10– it’s TRUE (30 > 10) -
It prints “x is greater than ten”
-
Then it enters the nested if and checks if
x > 20– also TRUE -
It prints “and also greater than 20!”
Output:
|
0 1 2 3 4 5 6 7 |
[1] "x is greater than ten" [1] "and also greater than 20!" |
If we changed x to 15, the output would be:
|
0 1 2 3 4 5 6 7 |
[1] "x is greater than ten" [1] "but less than 20." |
If we changed x to 5, the output would simply be:
|
0 1 2 3 4 5 6 |
[1] "x is less than or equal to 10." |
The nested condition is never even checked because the outer condition fails first.
Example 2: Voting Eligibility with Multiple Requirements
Let’s model a real-world scenario – checking if someone can vote:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
age <span class="token operator"><-</span> <span class="token number">19</span> has_id <span class="token operator"><-</span> <span class="token boolean">TRUE</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>age <span class="token operator">>=</span> <span class="token number">18</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Age requirement met."</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>has_id<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"You can vote! Both requirements satisfied."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"You need a valid ID to vote."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Sorry, you must be at least 18 to vote."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
When age = 19 and has_id = TRUE:
|
0 1 2 3 4 5 6 7 |
[1] "Age requirement met." [1] "You can vote! Both requirements satisfied." |
When age = 19 but has_id = FALSE:
|
0 1 2 3 4 5 6 7 |
[1] "Age requirement met." [1] "You need a valid ID to vote." |
When age = 16:
|
0 1 2 3 4 5 6 |
[1] "Sorry, you must be at least 18 to vote." |
This demonstrates the hierarchical nature – the ID check only matters if the age requirement is already satisfied.
Part 3: The else if Ladder – An Alternative to Deep Nesting
While nested ifs are powerful, R also provides the else if construct for checking multiple conditions in sequence. This is often cleaner than deep nesting:
Using else if
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
score <span class="token operator"><-</span> <span class="token number">85</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">90</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> grade <span class="token operator"><-</span> <span class="token string">"A"</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">80</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> grade <span class="token operator"><-</span> <span class="token string">"B"</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">70</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> grade <span class="token operator"><-</span> <span class="token string">"C"</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">60</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> grade <span class="token operator"><-</span> <span class="token string">"D"</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> grade <span class="token operator"><-</span> <span class="token string">"F"</span> <span class="token punctuation">}</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Grade:"</span><span class="token punctuation">,</span> grade<span class="token punctuation">)</span><span class="token punctuation">)</span> |
Output: [1] "Grade: B"
This is functionally similar to nesting but much more readable. R checks each condition in order and stops at the first TRUE condition.
When to Use Which?
-
Use nested ifs when the conditions have a hierarchical relationship – one condition only makes sense if another is true
-
Use else if ladders when checking mutually exclusive conditions in a sequence
Part 4: Nested ifelse() for Vectorized Operations
The ifelse() function is R’s vectorized version of if-else. It’s designed to work with entire vectors at once, which is much more efficient than writing loops.
Basic ifelse() Syntax
|
0 1 2 3 4 5 6 |
ifelse<span class="token punctuation">(</span>test<span class="token punctuation">,</span> yes<span class="token punctuation">,</span> no<span class="token punctuation">)</span> |
-
test: A logical condition (TRUE/FALSE) -
yes: Value returned when test is TRUE -
no: Value returned when test is FALSE
Simple ifelse() Example
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token comment"># Create a vector of scores</span> scores <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token number">65</span><span class="token punctuation">,</span> <span class="token number">82</span><span class="token punctuation">,</span> <span class="token number">47</span><span class="token punctuation">,</span> <span class="token number">91</span><span class="token punctuation">,</span> <span class="token number">73</span><span class="token punctuation">)</span> <span class="token comment"># Classify as pass/fail</span> results <span class="token operator"><-</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token string">"Pass"</span><span class="token punctuation">,</span> <span class="token string">"Fail"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>results<span class="token punctuation">)</span> |
Output: [1] "Pass" "Pass" "Fail" "Pass" "Pass"
The beauty of ifelse() is that it processes all five elements in one go!
Nesting ifelse() for Multiple Categories
When you need more than two categories, you can nest ifelse() statements by putting another ifelse() in the no argument:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
scores <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token number">65</span><span class="token punctuation">,</span> <span class="token number">82</span><span class="token punctuation">,</span> <span class="token number">47</span><span class="token punctuation">,</span> <span class="token number">91</span><span class="token punctuation">,</span> <span class="token number">73</span><span class="token punctuation">)</span> <span class="token comment"># Nested ifelse for letter grades</span> grades <span class="token operator"><-</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">90</span><span class="token punctuation">,</span> <span class="token string">"A"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">80</span><span class="token punctuation">,</span> <span class="token string">"B"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">70</span><span class="token punctuation">,</span> <span class="token string">"C"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token string">"D"</span><span class="token punctuation">,</span> <span class="token string">"F"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>grades<span class="token punctuation">)</span> |
Output: [1] "D" "B" "F" "A" "C"
Let’s trace how this works for the first score (65):
-
scores >= 90? FALSE → move to the firstno(which contains the next ifelse) -
scores >= 80? FALSE → move to the nextno -
scores >= 70? FALSE → move to the nextno -
scores >= 60? TRUE → return “D”
The nesting continues through all conditions until finding a TRUE or reaching the final default value.
Practical Example: Customer Segmentation
Let’s use a data frame to see nested ifelse in action with real data:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<span class="token comment"># Create customer data</span> customers <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> name <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token string">"Alice"</span><span class="token punctuation">,</span> <span class="token string">"Bob"</span><span class="token punctuation">,</span> <span class="token string">"Charlie"</span><span class="token punctuation">,</span> <span class="token string">"Diana"</span><span class="token punctuation">,</span> <span class="token string">"Eve"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> purchase_amount <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">1250</span><span class="token punctuation">,</span> <span class="token number">350</span><span class="token punctuation">,</span> <span class="token number">2200</span><span class="token punctuation">,</span> <span class="token number">75</span><span class="token punctuation">,</span> <span class="token number">890</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment"># Segment customers using nested ifelse</span> customers<span class="token operator">$</span>segment <span class="token operator"><-</span> ifelse<span class="token punctuation">(</span>customers<span class="token operator">$</span>purchase_amount <span class="token operator">>=</span> <span class="token number">1000</span><span class="token punctuation">,</span> <span class="token string">"Premium"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>customers<span class="token operator">$</span>purchase_amount <span class="token operator">>=</span> <span class="token number">500</span><span class="token punctuation">,</span> <span class="token string">"Regular"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>customers<span class="token operator">$</span>purchase_amount <span class="token operator">>=</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token string">"Occasional"</span><span class="token punctuation">,</span> <span class="token string">"New"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>customers<span class="token punctuation">)</span> |
Output:
| name | purchase_amount | segment |
|---|---|---|
| Alice | 1250 | Premium |
| Bob | 350 | Occasional |
| Charlie | 2200 | Premium |
| Diana | 75 | New |
| Eve | 890 | Regular |
Notice how each customer is correctly classified based on their purchase amount, all in a single vectorized operation.
Part 5: Advanced Nested If Examples
Example 1: Student Performance Evaluation
Let’s create a more comprehensive evaluation system:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<span class="token comment"># Student data</span> student <span class="token operator"><-</span> list<span class="token punctuation">(</span> name <span class="token operator">=</span> <span class="token string">"Alex"</span><span class="token punctuation">,</span> score <span class="token operator">=</span> <span class="token number">85</span><span class="token punctuation">,</span> attendance <span class="token operator">=</span> <span class="token number">0.95</span><span class="token punctuation">,</span> homework_completed <span class="token operator">=</span> <span class="token number">12</span><span class="token punctuation">,</span> total_homework <span class="token operator">=</span> <span class="token number">15</span> <span class="token punctuation">)</span> <span class="token comment"># Complex nested evaluation</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>student<span class="token operator">$</span>score <span class="token operator">>=</span> <span class="token number">60</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span>student<span class="token operator">$</span>name<span class="token punctuation">,</span> <span class="token string">"passed the exam."</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Check attendance</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>student<span class="token operator">$</span>attendance <span class="token operator">>=</span> <span class="token number">0.9</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Has excellent attendance."</span><span class="token punctuation">)</span> <span class="token comment"># Check homework completion</span> homework_percentage <span class="token operator"><-</span> student<span class="token operator">$</span>homework_completed <span class="token operator">/</span> student<span class="token operator">$</span>total_homework <span class="token keyword">if</span> <span class="token punctuation">(</span>homework_percentage <span class="token operator">>=</span> <span class="token number">0.8</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"And completes most homework!"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Recommendation: Award certificate of excellence."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"But needs to improve homework completion."</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Recommendation: Encourage more homework submission."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>student<span class="token operator">$</span>attendance <span class="token operator">>=</span> <span class="token number">0.7</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Has acceptable attendance."</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Recommendation: Monitor attendance."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Has poor attendance."</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Recommendation: Schedule attendance improvement meeting."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span>student<span class="token operator">$</span>name<span class="token punctuation">,</span> <span class="token string">"failed the exam."</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Check if close to passing</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>student<span class="token operator">$</span>score <span class="token operator">>=</span> <span class="token number">55</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"But was close to passing. Consider reviewing borderline cases."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Needs significant improvement."</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
This example shows three levels of nesting, each making more specific decisions based on previous conditions.
Example 2: Weather Recommendation System
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
weather <span class="token operator"><-</span> list<span class="token punctuation">(</span> temperature <span class="token operator">=</span> <span class="token number">18</span><span class="token punctuation">,</span> is_raining <span class="token operator">=</span> <span class="token boolean">TRUE</span><span class="token punctuation">,</span> wind_speed <span class="token operator">=</span> <span class="token number">15</span><span class="token punctuation">,</span> is_weekend <span class="token operator">=</span> <span class="token boolean">TRUE</span> <span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>weather<span class="token operator">$</span>is_weekend<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"It's the weekend!"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>weather<span class="token operator">$</span>temperature <span class="token operator">></span> <span class="token number">20</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>weather<span class="token operator">$</span>is_raining<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Perfect day for a picnic! ☀️"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>weather<span class="token operator">$</span>wind_speed <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Rainy but calm. Museum visit recommended. 🏛️"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Stormy weather. Stay home and read a book! 📚"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>weather<span class="token operator">$</span>temperature <span class="token operator">></span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>weather<span class="token operator">$</span>is_raining<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Cool but nice for a walk. 🚶"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Chilly and wet. How about a movie? 🎬"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Too cold for outdoor activities. 🔥"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Weekday - focus on work!"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>weather<span class="token operator">$</span>is_raining<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Take an umbrella to work! ☔"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Part 6: Common Mistakes and How to Avoid Them
Mistake 1: Forgetting Braces
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span class="token comment"># ❌ This can cause unexpected behavior</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">10</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"x is greater than 10"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">20</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"x is greater than 20"</span><span class="token punctuation">)</span> <span class="token comment"># ✅ Always use braces for clarity and safety</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"x is greater than 10"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">20</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"x is greater than 20"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Mistake 2: Misaligned else Statements
In R, the else keyword must be on the same line as the closing brace of the previous if:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment"># ❌ This will cause an error</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Above 10"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"10 or below"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># ✅ This is correct</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Above 10"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"10 or below"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Mistake 3: Overcomplicating with Deep Nesting
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span class="token comment"># ❌ Too deep - hard to read and debug</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>a<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>c<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>d<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># way too nested!</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># ✅ Consider refactoring with:</span> <span class="token comment"># - else if ladder</span> <span class="token comment"># - Combining conditions with && (AND) and || (OR)</span> <span class="token comment"># - Separate functions</span> |
Mistake 4: Not Handling All Cases in Nested ifelse
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment"># ❌ Missing a default case</span> grades <span class="token operator"><-</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">90</span><span class="token punctuation">,</span> <span class="token string">"A"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">80</span><span class="token punctuation">,</span> <span class="token string">"B"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">70</span><span class="token punctuation">,</span> <span class="token string">"C"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token string">"D"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># No default for < 60!</span> <span class="token comment"># ✅ Always include a final default value</span> grades <span class="token operator"><-</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">90</span><span class="token punctuation">,</span> <span class="token string">"A"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">80</span><span class="token punctuation">,</span> <span class="token string">"B"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">70</span><span class="token punctuation">,</span> <span class="token string">"C"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>scores <span class="token operator">>=</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token string">"D"</span><span class="token punctuation">,</span> <span class="token string">"F"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Default for < 60</span> |
Part 7: Alternative Approaches for Complex Logic
When nested ifs become too complex, consider these alternatives:
1. The switch() Function for Single Value Checks
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<span class="token comment"># Instead of nested ifs for exact matches</span> fruit <span class="token operator"><-</span> <span class="token string">"apple"</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>fruit <span class="token operator">==</span> <span class="token string">"apple"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Apples are $1.50/lb"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>fruit <span class="token operator">==</span> <span class="token string">"banana"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Bananas are $0.50/lb"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>fruit <span class="token operator">==</span> <span class="token string">"orange"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Oranges are $2.00/lb"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Fruit not in inventory"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Use switch instead</span> price_info <span class="token operator"><-</span> switch<span class="token punctuation">(</span>fruit<span class="token punctuation">,</span> <span class="token string">"apple"</span> <span class="token operator">=</span> <span class="token string">"Apples are $1.50/lb"</span><span class="token punctuation">,</span> <span class="token string">"banana"</span> <span class="token operator">=</span> <span class="token string">"Bananas are $0.50/lb"</span><span class="token punctuation">,</span> <span class="token string">"orange"</span> <span class="token operator">=</span> <span class="token string">"Oranges are $2.00/lb"</span><span class="token punctuation">,</span> <span class="token string">"Fruit not in inventory"</span> <span class="token punctuation">)</span> print<span class="token punctuation">(</span>price_info<span class="token punctuation">)</span> |
2. The case_when() Function from dplyr
For data frames with many conditions, dplyr::case_when() is much cleaner than nested ifelse:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
library<span class="token punctuation">(</span>dplyr<span class="token punctuation">)</span> <span class="token comment"># Complex nested ifelse (hard to read)</span> df<span class="token operator">$</span>category <span class="token operator"><-</span> ifelse<span class="token punctuation">(</span>df<span class="token operator">$</span>value <span class="token operator">></span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token string">"Very High"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>df<span class="token operator">$</span>value <span class="token operator">></span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token string">"High"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>df<span class="token operator">$</span>value <span class="token operator">></span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token string">"Medium"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>df<span class="token operator">$</span>value <span class="token operator">></span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token string">"Low"</span><span class="token punctuation">,</span> <span class="token string">"Very Low"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Same logic with case_when (much cleaner)</span> df <span class="token operator"><-</span> df <span class="token percent-operator operator">%>%</span> mutate<span class="token punctuation">(</span>category <span class="token operator">=</span> case_when<span class="token punctuation">(</span> value <span class="token operator">></span> <span class="token number">100</span> <span class="token operator">~</span> <span class="token string">"Very High"</span><span class="token punctuation">,</span> value <span class="token operator">></span> <span class="token number">50</span> <span class="token operator">~</span> <span class="token string">"High"</span><span class="token punctuation">,</span> value <span class="token operator">></span> <span class="token number">20</span> <span class="token operator">~</span> <span class="token string">"Medium"</span><span class="token punctuation">,</span> value <span class="token operator">></span> <span class="token number">10</span> <span class="token operator">~</span> <span class="token string">"Low"</span><span class="token punctuation">,</span> <span class="token boolean">TRUE</span> <span class="token operator">~</span> <span class="token string">"Very Low"</span> <span class="token comment"># Default case</span> <span class="token punctuation">)</span><span class="token punctuation">)</span> |
3. Creating Helper Functions
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment"># Instead of deeply nested code, break into functions</span> evaluate_student <span class="token operator"><-</span> <span class="token keyword">function</span><span class="token punctuation">(</span>score<span class="token punctuation">,</span> attendance<span class="token punctuation">,</span> homework<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator"><</span> <span class="token number">60</span><span class="token punctuation">)</span> return<span class="token punctuation">(</span><span class="token string">"Failed"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>attendance <span class="token operator"><</span> <span class="token number">0.7</span><span class="token punctuation">)</span> return<span class="token punctuation">(</span><span class="token string">"Passed but attendance warning"</span><span class="token punctuation">)</span> <span class="token comment"># Deeper logic in separate function</span> return<span class="token punctuation">(</span>evaluate_homework<span class="token punctuation">(</span>homework<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> evaluate_homework <span class="token operator"><-</span> <span class="token keyword">function</span><span class="token punctuation">(</span>homework<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>homework <span class="token operator">>=</span> <span class="token number">0.9</span><span class="token punctuation">)</span> return<span class="token punctuation">(</span><span class="token string">"Excellent"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>homework <span class="token operator">>=</span> <span class="token number">0.7</span><span class="token punctuation">)</span> return<span class="token punctuation">(</span><span class="token string">"Good"</span><span class="token punctuation">)</span> return<span class="token punctuation">(</span><span class="token string">"Needs improvement"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Summary: The Nested If Philosophy
Nested if statements are your tool for hierarchical decision-making. Master these patterns:
-
Simple nesting – One condition inside another
-
else if ladders – Sequential mutually exclusive conditions
-
Nested ifelse – Vectorized operations for data frames
-
Alternative approaches – switch(), case_when(), and helper functions
Key takeaways:
-
Always indent nested code for readability
-
Use braces even when optional
-
Consider
else iffor sequential checks -
Use
ifelse()for vector operations -
Don’t nest too deep – refactor when necessary
When to use each:
-
Nested if/else: When conditions have hierarchical relationships
-
else if ladder: When checking multiple mutually exclusive conditions
-
Nested ifelse: When working with vectors or data frame columns
-
case_when: For complex, multi-condition logic in data frames
-
switch: For exact matches to a single value
The art of nested ifs is knowing not just how to write them, but when to use them and when to choose a simpler alternative. Start simple, add complexity gradually, and always prioritize code that’s easy for humans to read and understand.
Would you like me to elaborate on any specific aspect of nested ifs or explore more complex real-world examples?
