Chapter 22: R For Loop
Part 1: What is a For Loop?
A for loop is a control structure that repeats a block of code for each element in a sequence or collection. It’s called a “for” loop because it runs “for” each item in a set.
The Basic Syntax
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">for</span> <span class="token punctuation">(</span>variable <span class="token keyword">in</span> sequence<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Code to execute for each element</span> <span class="token comment"># You can use the variable inside the loop</span> <span class="token punctuation">}</span> |
-
variable: A name you choose to represent the current element
-
sequence: A vector, list, or other collection to iterate over
-
{ }: The code block that runs for each element
A Simple Example
|
0 1 2 3 4 5 6 7 8 |
<span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"This is iteration number:"</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 |
[1] "This is iteration number: 1" [1] "This is iteration number: 2" [1] "This is iteration number: 3" [1] "This is iteration number: 4" [1] "This is iteration number: 5" |
Let’s trace through what happens:
-
itakes the value1, runs the code inside -
itakes the value2, runs the code inside -
Continues until
itakes the value5 -
After the last iteration, the loop ends
Part 2: Different Types of Sequences
For loops can iterate over many different types of sequences:
1. Numeric Sequences
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment"># Basic sequence</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>i<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Sequence with steps</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> seq<span class="token punctuation">(</span>from <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> to <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">,</span> by <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Even number:"</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Decreasing sequence</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">5</span><span class="token operator">:</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Countdown:"</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
2. Character Vectors
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
fruits <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token string">"apple"</span><span class="token punctuation">,</span> <span class="token string">"banana"</span><span class="token punctuation">,</span> <span class="token string">"orange"</span><span class="token punctuation">,</span> <span class="token string">"grape"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>fruit <span class="token keyword">in</span> fruits<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"I love"</span><span class="token punctuation">,</span> fruit<span class="token punctuation">,</span> <span class="token string">"s!"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"The word"</span><span class="token punctuation">,</span> fruit<span class="token punctuation">,</span> <span class="token string">"has"</span><span class="token punctuation">,</span> nchar<span class="token punctuation">(</span>fruit<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"letters"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"---"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[1] "I love apple s!" [1] "The word apple has 5 letters" [1] "---" [1] "I love banana s!" [1] "The word banana has 6 letters" [1] "---" [1] "I love orange s!" [1] "The word orange has 6 letters" [1] "---" [1] "I love grape s!" [1] "The word grape has 5 letters" [1] "---" |
3. Lists
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span class="token comment"># Create a mixed list</span> my_list <span class="token operator"><-</span> list<span class="token punctuation">(</span> name <span class="token operator">=</span> <span class="token string">"Alice"</span><span class="token punctuation">,</span> age <span class="token operator">=</span> <span class="token number">25</span><span class="token punctuation">,</span> scores <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">85</span><span class="token punctuation">,</span> <span class="token number">92</span><span class="token punctuation">,</span> <span class="token number">78</span><span class="token punctuation">)</span><span class="token punctuation">,</span> passed <span class="token operator">=</span> <span class="token boolean">TRUE</span> <span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>item <span class="token keyword">in</span> my_list<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Item value:"</span><span class="token punctuation">,</span> item<span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Item type:"</span><span class="token punctuation">,</span> typeof<span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"---"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
4. Data Frame Columns
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment"># Create a data frame</span> students <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 punctuation">,</span> age <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token number">23</span><span class="token punctuation">)</span><span class="token punctuation">,</span> grade <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token string">"A"</span><span class="token punctuation">,</span> <span class="token string">"B"</span><span class="token punctuation">,</span> <span class="token string">"A-"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> stringsAsFactors <span class="token operator">=</span> <span class="token boolean">FALSE</span> <span class="token punctuation">)</span> <span class="token comment"># Iterate over columns</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>col <span class="token keyword">in</span> names<span class="token punctuation">(</span>students<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Column:"</span><span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>students<span class="token punctuation">[</span><span class="token punctuation">[</span>col<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"---"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Part 3: Accessing Index and Value
Sometimes you need both the position (index) and the value:
Using 1:length(sequence)
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
fruits <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token string">"apple"</span><span class="token punctuation">,</span> <span class="token string">"banana"</span><span class="token punctuation">,</span> <span class="token string">"orange"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>length<span class="token punctuation">(</span>fruits<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Index:"</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token string">"- Fruit:"</span><span class="token punctuation">,</span> fruits<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">" This is the"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>i <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">"first"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>i <span class="token operator">==</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"second"</span><span class="token punctuation">,</span> <span class="token string">"third"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"fruit"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 11 |
[1] "Index: 1 - Fruit: apple" [1] " This is the first fruit" [1] "Index: 2 - Fruit: banana" [1] " This is the second fruit" [1] "Index: 3 - Fruit: orange" [1] " This is the third fruit" |
Using seq_along() – The Safe Way
The seq_along() function is safer than 1:length() because it handles empty vectors correctly:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span class="token comment"># Safe approach with seq_along()</span> fruits <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token string">"apple"</span><span class="token punctuation">,</span> <span class="token string">"banana"</span><span class="token punctuation">,</span> <span class="token string">"orange"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>fruits<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Position"</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token string">"contains"</span><span class="token punctuation">,</span> fruits<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Why seq_along is better</span> empty_vector <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># This would cause problems: 1:length(empty_vector) = 1:0</span> <span class="token comment"># for (i in 1:length(empty_vector)) { # Runs with i=1, then i=0!</span> <span class="token comment"># This handles empty vectors correctly</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>empty_vector<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># This code never runs (good!)</span> print<span class="token punctuation">(</span><span class="token string">"This won't print"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Part 4: Building Results with For Loops
A common pattern is to build a result vector or data frame inside a loop:
Building a Vector
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment"># Initialize an empty vector</span> squares <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> squares<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> i<span class="token operator">^</span><span class="token number">2</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Added"</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token string">"squared ="</span><span class="token punctuation">,</span> i<span class="token operator">^</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> print<span class="token punctuation">(</span><span class="token string">"Final squares vector:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>squares<span class="token punctuation">)</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
[1] "Added 1 squared = 1" [1] "Added 2 squared = 4" [1] "Added 3 squared = 9" [1] "Added 4 squared = 16" [1] "Added 5 squared = 25" [1] "Final squares vector:" [1] 1 4 9 16 25 |
Better Approach: Pre-allocate for Speed
For large loops, pre-allocating memory is much faster:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
n <span class="token operator"><-</span> <span class="token number">10000</span> <span class="token comment"># ❌ Slow - grows vector each time</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> results <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> results<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> i<span class="token operator">^</span><span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment"># ✅ Fast - pre-allocate</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> results <span class="token operator"><-</span> numeric<span class="token punctuation">(</span>n<span class="token punctuation">)</span> <span class="token comment"># Create vector of length n</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> results<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> i<span class="token operator">^</span><span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> |
Building a Data Frame
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span class="token comment"># Initialize empty data frame</span> results_df <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> iteration <span class="token operator">=</span> integer<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> value <span class="token operator">=</span> numeric<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> squared <span class="token operator">=</span> numeric<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> stringsAsFactors <span class="token operator">=</span> <span class="token boolean">FALSE</span> <span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> new_row <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> iteration <span class="token operator">=</span> i<span class="token punctuation">,</span> value <span class="token operator">=</span> i<span class="token punctuation">,</span> squared <span class="token operator">=</span> i<span class="token operator">^</span><span class="token number">2</span> <span class="token punctuation">)</span> results_df <span class="token operator"><-</span> rbind<span class="token punctuation">(</span>results_df<span class="token punctuation">,</span> new_row<span class="token punctuation">)</span> <span class="token punctuation">}</span> print<span class="token punctuation">(</span>results_df<span class="token punctuation">)</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 11 |
iteration value squared 1 1 1 1 2 2 2 4 3 3 3 9 4 4 4 16 5 5 5 25 |
Part 5: Nested For Loops
Sometimes you need loops inside loops – like processing rows and columns of a matrix:
Basic Nested Loop
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span class="token comment"># Create a 3x3 matrix</span> matrix_data <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">1</span><span class="token operator">:</span><span class="token number">9</span><span class="token punctuation">,</span> nrow <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">,</span> ncol <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Original matrix:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>matrix_data<span class="token punctuation">)</span> <span class="token comment"># Process each element</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>nrow<span class="token punctuation">(</span>matrix_data<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>j <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>ncol<span class="token punctuation">(</span>matrix_data<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> value <span class="token operator"><-</span> matrix_data<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Element at ["</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token string">","</span><span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token string">"] ="</span><span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> print<span class="token punctuation">(</span><span class="token string">"--- End of row ---"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Creating a Multiplication Table
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment"># Create an empty 10x10 matrix</span> mult_table <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> nrow <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">,</span> ncol <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><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">for</span> <span class="token punctuation">(</span>j <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> mult_table<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator"><-</span> i <span class="token operator">*</span> j <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># Print the table (first 5 rows and columns)</span> print<span class="token punctuation">(</span>mult_table<span class="token punctuation">[</span><span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 11 |
[,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 4 5 [2,] 2 4 6 8 10 [3,] 3 6 9 12 15 [4,] 4 8 12 16 20 [5,] 5 10 15 20 25 |
More Complex Nested Example: Student Grades
|
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 |
<span class="token comment"># Sample grade data</span> grades <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> student <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 punctuation">,</span> math <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">85</span><span class="token punctuation">,</span> <span class="token number">92</span><span class="token punctuation">,</span> <span class="token number">78</span><span class="token punctuation">)</span><span class="token punctuation">,</span> science <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">90</span><span class="token punctuation">,</span> <span class="token number">88</span><span class="token punctuation">,</span> <span class="token number">85</span><span class="token punctuation">)</span><span class="token punctuation">,</span> english <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">88</span><span class="token punctuation">,</span> <span class="token number">79</span><span class="token punctuation">,</span> <span class="token number">92</span><span class="token punctuation">)</span><span class="token punctuation">,</span> stringsAsFactors <span class="token operator">=</span> <span class="token boolean">FALSE</span> <span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Grade Summary:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>grades<span class="token punctuation">)</span> <span class="token comment"># Calculate statistics</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>nrow<span class="token punctuation">(</span>grades<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"---"</span><span class="token punctuation">,</span> grades<span class="token operator">$</span>student<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">"---"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> student_total <span class="token operator"><-</span> <span class="token number">0</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>j <span class="token keyword">in</span> <span class="token number">2</span><span class="token operator">:</span>ncol<span class="token punctuation">(</span>grades<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Start from column 2 (skip student name)</span> subject <span class="token operator"><-</span> names<span class="token punctuation">(</span>grades<span class="token punctuation">)</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> grade <span class="token operator"><-</span> grades<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> student_total <span class="token operator"><-</span> student_total <span class="token operator">+</span> grade print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">,</span> subject<span class="token punctuation">,</span> <span class="token string">":"</span><span class="token punctuation">,</span> grade<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> avg_grade <span class="token operator"><-</span> student_total <span class="token operator">/</span> <span class="token punctuation">(</span>ncol<span class="token punctuation">(</span>grades<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">" Average:"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>avg_grade<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">" Status:"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>avg_grade <span class="token operator">>=</span> <span class="token number">85</span><span class="token punctuation">,</span> <span class="token string">"Excellent"</span><span class="token punctuation">,</span> <span class="token string">"Good"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Part 6: Control Statements in For Loops
Using break to Exit Early
The break statement stops the loop immediately:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment"># Find the first number whose square is greater than 50</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> square <span class="token operator"><-</span> i<span class="token operator">^</span><span class="token number">2</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Checking"</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token string">"- square is"</span><span class="token punctuation">,</span> square<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>square <span class="token operator">></span> <span class="token number">50</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Found it!"</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token string">"squared is"</span><span class="token punctuation">,</span> square<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">break</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Loop stopped at i ="</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">)</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[1] "Checking 1 - square is 1" [1] "Checking 2 - square is 4" [1] "Checking 3 - square is 9" [1] "Checking 4 - square is 16" [1] "Checking 5 - square is 25" [1] "Checking 6 - square is 36" [1] "Checking 7 - square is 49" [1] "Checking 8 - square is 64" [1] "Found it! 8 squared is 64" [1] "Loop stopped at i = 8" |
Using next to Skip Iterations
The next statement skips to the next iteration:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment"># Process only even numbers</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><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>i <span class="token percent-operator operator">%%</span> <span class="token number">2</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># If odd</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Skipping odd number:"</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">next</span> <span class="token punctuation">}</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Processing even number:"</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token string">"- square is"</span><span class="token punctuation">,</span> i<span class="token operator">^</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[1] "Skipping odd number: 1" [1] "Processing even number: 2 - square is 4" [1] "Skipping odd number: 3" [1] "Processing even number: 4 - square is 16" [1] "Skipping odd number: 5" [1] "Processing even number: 6 - square is 36" [1] "Skipping odd number: 7" [1] "Processing even number: 8 - square is 64" [1] "Skipping odd number: 9" [1] "Processing even number: 10 - square is 100" |
Part 7: Real-World Examples
Example 1: Data Cleaning
|
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 |
<span class="token comment"># Create messy data</span> messy_data <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> id <span class="token operator">=</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><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> age <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token string">"25"</span><span class="token punctuation">,</span> <span class="token string">"thirty"</span><span class="token punctuation">,</span> <span class="token string">"30"</span><span class="token punctuation">,</span> <span class="token string">"22"</span><span class="token punctuation">,</span> <span class="token string">"28"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> score <span class="token operator">=</span> c<span class="token punctuation">(</span><span class="token number">85</span><span class="token punctuation">,</span> <span class="token keyword">NA</span><span class="token punctuation">,</span> <span class="token string">"92"</span><span class="token punctuation">,</span> <span class="token string">"78.5"</span><span class="token punctuation">,</span> <span class="token string">"91"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> stringsAsFactors <span class="token operator">=</span> <span class="token boolean">FALSE</span> <span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Original messy data:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>messy_data<span class="token punctuation">)</span> <span class="token comment"># Clean the data</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>nrow<span class="token punctuation">(</span>messy_data<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Clean names: trim and proper case</span> messy_data<span class="token operator">$</span>name<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> trimws<span class="token punctuation">(</span>messy_data<span class="token operator">$</span>name<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> messy_data<span class="token operator">$</span>name<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> paste0<span class="token punctuation">(</span> toupper<span class="token punctuation">(</span>substr<span class="token punctuation">(</span>messy_data<span class="token operator">$</span>name<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> tolower<span class="token punctuation">(</span>substr<span class="token punctuation">(</span>messy_data<span class="token operator">$</span>name<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> nchar<span class="token punctuation">(</span>messy_data<span class="token operator">$</span>name<span class="token punctuation">[</span>i<span class="token punctuation">]</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"># Clean age: convert to numeric, handle non-numeric</span> age_val <span class="token operator"><-</span> suppressWarnings<span class="token punctuation">(</span>as.numeric<span class="token punctuation">(</span>messy_data<span class="token operator">$</span>age<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>is.na<span class="token punctuation">(</span>age_val<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> messy_data<span class="token operator">$</span>age<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> <span class="token keyword">NA</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Warning: Invalid age for"</span><span class="token punctuation">,</span> messy_data<span class="token operator">$</span>name<span class="token punctuation">[</span>i<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 punctuation">{</span> messy_data<span class="token operator">$</span>age<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> age_val <span class="token punctuation">}</span> <span class="token comment"># Clean score: convert to numeric</span> score_val <span class="token operator"><-</span> suppressWarnings<span class="token punctuation">(</span>as.numeric<span class="token punctuation">(</span>messy_data<span class="token operator">$</span>score<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>is.na<span class="token punctuation">(</span>score_val<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> messy_data<span class="token operator">$</span>score<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> <span class="token keyword">NA</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Warning: Invalid score for"</span><span class="token punctuation">,</span> messy_data<span class="token operator">$</span>name<span class="token punctuation">[</span>i<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 punctuation">{</span> messy_data<span class="token operator">$</span>score<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> score_val <span class="token punctuation">}</span> <span class="token punctuation">}</span> print<span class="token punctuation">(</span><span class="token string">"Cleaned data:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>messy_data<span class="token punctuation">)</span> |
Example 2: Financial Calculator – Compound Interest
|
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 |
<span class="token comment"># Calculate compound interest for different rates</span> principal <span class="token operator"><-</span> <span class="token number">1000</span> years <span class="token operator"><-</span> <span class="token number">10</span> rates <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token number">0.01</span><span class="token punctuation">,</span> <span class="token number">0.02</span><span class="token punctuation">,</span> <span class="token number">0.03</span><span class="token punctuation">,</span> <span class="token number">0.04</span><span class="token punctuation">,</span> <span class="token number">0.05</span><span class="token punctuation">)</span> <span class="token comment"># Create results matrix</span> results <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> nrow <span class="token operator">=</span> years<span class="token punctuation">,</span> ncol <span class="token operator">=</span> length<span class="token punctuation">(</span>rates<span class="token punctuation">)</span><span class="token punctuation">)</span> colnames<span class="token punctuation">(</span>results<span class="token punctuation">)</span> <span class="token operator"><-</span> paste0<span class="token punctuation">(</span>rates <span class="token operator">*</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token string">"%"</span><span class="token punctuation">)</span> rownames<span class="token punctuation">(</span>results<span class="token punctuation">)</span> <span class="token operator"><-</span> paste0<span class="token punctuation">(</span><span class="token string">"Year "</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token operator">:</span>years<span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>rates<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> rate <span class="token operator"><-</span> rates<span class="token punctuation">[</span>i<span class="token punctuation">]</span> amount <span class="token operator"><-</span> principal <span class="token keyword">for</span> <span class="token punctuation">(</span>year <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>years<span class="token punctuation">)</span> <span class="token punctuation">{</span> amount <span class="token operator"><-</span> amount <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">+</span> rate<span class="token punctuation">)</span> results<span class="token punctuation">[</span>year<span class="token punctuation">,</span> i<span class="token punctuation">]</span> <span class="token operator"><-</span> round<span class="token punctuation">(</span>amount<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> print<span class="token punctuation">(</span><span class="token string">"Compound Interest Growth ($1000 principal):"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>results<span class="token punctuation">)</span> <span class="token comment"># Calculate final amounts</span> final_amounts <span class="token operator"><-</span> results<span class="token punctuation">[</span>years<span class="token punctuation">,</span> <span class="token punctuation">]</span> print<span class="token punctuation">(</span><span class="token string">"Final amounts after 10 years:"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>rates<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span>rates<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator">*</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token string">"%: $"</span><span class="token punctuation">,</span> final_amounts<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">" (Gain: $"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>final_amounts<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">-</span> principal<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">")"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Example 3: Text Analysis
|
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 |
<span class="token comment"># Analyze a text</span> text <span class="token operator"><-</span> <span class="token string">"The quick brown fox jumps over the lazy dog. The dog sleeps while the fox runs."</span> <span class="token comment"># Split into words</span> words <span class="token operator"><-</span> strsplit<span class="token punctuation">(</span>tolower<span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"[ .,!?;:]+"</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token comment"># Remove empty strings</span> words <span class="token operator"><-</span> words<span class="token punctuation">[</span>words <span class="token operator">!=</span> <span class="token string">""</span><span class="token punctuation">]</span> <span class="token comment"># Initialize statistics</span> word_stats <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> word <span class="token operator">=</span> unique<span class="token punctuation">(</span>words<span class="token punctuation">)</span><span class="token punctuation">,</span> count <span class="token operator">=</span> integer<span class="token punctuation">(</span>length<span class="token punctuation">(</span>unique<span class="token punctuation">(</span>words<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> length <span class="token operator">=</span> integer<span class="token punctuation">(</span>length<span class="token punctuation">(</span>unique<span class="token punctuation">(</span>words<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> stringsAsFactors <span class="token operator">=</span> <span class="token boolean">FALSE</span> <span class="token punctuation">)</span> <span class="token comment"># Count words</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>word_stats<span class="token operator">$</span>word<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> current_word <span class="token operator"><-</span> word_stats<span class="token operator">$</span>word<span class="token punctuation">[</span>i<span class="token punctuation">]</span> word_stats<span class="token operator">$</span>count<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> sum<span class="token punctuation">(</span>words <span class="token operator">==</span> current_word<span class="token punctuation">)</span> word_stats<span class="token operator">$</span>length<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> nchar<span class="token punctuation">(</span>current_word<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Add frequency percentage</span> word_stats<span class="token operator">$</span>percentage <span class="token operator"><-</span> round<span class="token punctuation">(</span>word_stats<span class="token operator">$</span>count <span class="token operator">/</span> length<span class="token punctuation">(</span>words<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token comment"># Sort by frequency</span> word_stats <span class="token operator"><-</span> word_stats<span class="token punctuation">[</span>order<span class="token punctuation">(</span>word_stats<span class="token operator">$</span>count<span class="token punctuation">,</span> decreasing <span class="token operator">=</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">]</span> print<span class="token punctuation">(</span><span class="token string">"Word Frequency Analysis:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>word_stats<span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Total words:"</span><span class="token punctuation">,</span> length<span class="token punctuation">(</span>words<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Unique words:"</span><span class="token punctuation">,</span> nrow<span class="token punctuation">(</span>word_stats<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> |
Example 4: Simulation – Dice Rolling
|
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 |
<span class="token comment"># Simulate rolling dice and track results</span> set.seed<span class="token punctuation">(</span><span class="token number">123</span><span class="token punctuation">)</span> <span class="token comment"># For reproducibility</span> n_rolls <span class="token operator"><-</span> <span class="token number">1000</span> results <span class="token operator"><-</span> integer<span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">)</span> <span class="token comment"># Count for each face (1-6)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>roll <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>n_rolls<span class="token punctuation">)</span> <span class="token punctuation">{</span> dice <span class="token operator"><-</span> sample<span class="token punctuation">(</span><span class="token number">1</span><span class="token operator">:</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token comment"># Roll one die</span> results<span class="token punctuation">[</span>dice<span class="token punctuation">]</span> <span class="token operator"><-</span> results<span class="token punctuation">[</span>dice<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token comment"># Calculate percentages</span> percentages <span class="token operator"><-</span> round<span class="token punctuation">(</span>results <span class="token operator">/</span> n_rolls <span class="token operator">*</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token comment"># Create results data frame</span> dice_results <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> face <span class="token operator">=</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">6</span><span class="token punctuation">,</span> count <span class="token operator">=</span> results<span class="token punctuation">,</span> percentage <span class="token operator">=</span> percentages<span class="token punctuation">,</span> expected <span class="token operator">=</span> round<span class="token punctuation">(</span><span class="token number">100</span><span class="token operator">/</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Dice Rolling Simulation Results:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>dice_results<span class="token punctuation">)</span> <span class="token comment"># Check if the dice seem fair</span> chi_square <span class="token operator"><-</span> sum<span class="token punctuation">(</span><span class="token punctuation">(</span>results <span class="token operator">-</span> n_rolls<span class="token operator">/</span><span class="token number">6</span><span class="token punctuation">)</span><span class="token operator">^</span><span class="token number">2</span> <span class="token operator">/</span> <span class="token punctuation">(</span>n_rolls<span class="token operator">/</span><span class="token number">6</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Chi-square statistic:"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>chi_square<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Degrees of freedom: 5"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Critical value at 0.05: 11.07"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Dice appear"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>chi_square <span class="token operator"><</span> <span class="token number">11.07</span><span class="token punctuation">,</span> <span class="token string">"fair"</span><span class="token punctuation">,</span> <span class="token string">"biased"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> |
Example 5: Stock Price Simulation
|
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 |
<span class="token comment"># Simulate stock price paths</span> set.seed<span class="token punctuation">(</span><span class="token number">456</span><span class="token punctuation">)</span> n_days <span class="token operator"><-</span> <span class="token number">252</span> <span class="token comment"># Trading days in a year</span> n_simulations <span class="token operator"><-</span> <span class="token number">5</span> starting_price <span class="token operator"><-</span> <span class="token number">100</span> drift <span class="token operator"><-</span> <span class="token number">0.0005</span> <span class="token comment"># Daily expected return</span> volatility <span class="token operator"><-</span> <span class="token number">0.02</span> <span class="token comment"># Daily volatility</span> <span class="token comment"># Create matrix to store all paths</span> prices <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> nrow <span class="token operator">=</span> n_days <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> ncol <span class="token operator">=</span> n_simulations<span class="token punctuation">)</span> prices<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token operator"><-</span> starting_price <span class="token comment"># Simulate each path</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>sim <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>n_simulations<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>day <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>n_days<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Random daily return</span> daily_return <span class="token operator"><-</span> rnorm<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> mean <span class="token operator">=</span> drift<span class="token punctuation">,</span> sd <span class="token operator">=</span> volatility<span class="token punctuation">)</span> prices<span class="token punctuation">[</span>day <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> sim<span class="token punctuation">]</span> <span class="token operator"><-</span> prices<span class="token punctuation">[</span>day<span class="token punctuation">,</span> sim<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">+</span> daily_return<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># Calculate statistics for each path</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>sim <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>n_simulations<span class="token punctuation">)</span> <span class="token punctuation">{</span> final_price <span class="token operator"><-</span> prices<span class="token punctuation">[</span>n_days <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> sim<span class="token punctuation">]</span> total_return <span class="token operator"><-</span> <span class="token punctuation">(</span>final_price <span class="token operator">/</span> starting_price <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">100</span> max_price <span class="token operator"><-</span> max<span class="token punctuation">(</span>prices<span class="token punctuation">[</span><span class="token punctuation">,</span> sim<span class="token punctuation">]</span><span class="token punctuation">)</span> min_price <span class="token operator"><-</span> min<span class="token punctuation">(</span>prices<span class="token punctuation">[</span><span class="token punctuation">,</span> sim<span class="token punctuation">]</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"--- Simulation"</span><span class="token punctuation">,</span> sim<span class="token punctuation">,</span> <span class="token string">"---"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">" Starting: $"</span><span class="token punctuation">,</span> starting_price<span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">" Final: $"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>final_price<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">" Return:"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>total_return<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"%"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">" Max: $"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>max_price<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">" Min: $"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>min_price<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Part 8: For Loops vs. Vectorized Operations
When Vectorization is Better
R is optimized for vectorized operations, which are often much faster than loops:
|
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 |
<span class="token comment"># Create large dataset</span> n <span class="token operator"><-</span> <span class="token number">1000000</span> numbers <span class="token operator"><-</span> <span class="token number">1</span><span class="token operator">:</span>n <span class="token comment"># ❌ Slow: Using a for loop</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> squares <span class="token operator"><-</span> numeric<span class="token punctuation">(</span>n<span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> squares<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> numbers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator">^</span><span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment"># ✅ Fast: Using vectorized operation</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> squares_vec <span class="token operator"><-</span> numbers<span class="token operator">^</span><span class="token number">2</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment"># Check if results are the same</span> print<span class="token punctuation">(</span>all<span class="token punctuation">(</span>squares <span class="token operator">==</span> squares_vec<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># TRUE</span> |
When For Loops Are Necessary
Sometimes for loops are the right tool:
|
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 |
<span class="token comment"># When each iteration depends on the previous one</span> fibonacci <span class="token operator"><-</span> numeric<span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span> fibonacci<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator"><-</span> <span class="token number">1</span> fibonacci<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator"><-</span> <span class="token number">1</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">3</span><span class="token operator">:</span><span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fibonacci<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> fibonacci<span class="token punctuation">[</span>i<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> fibonacci<span class="token punctuation">[</span>i<span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token punctuation">}</span> print<span class="token punctuation">(</span>fibonacci<span class="token punctuation">)</span> <span class="token comment"># When processing requires complex conditional logic</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">100</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token percent-operator operator">%%</span> <span class="token number">15</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"FizzBuzz"</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>i <span class="token percent-operator operator">%%</span> <span class="token number">3</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Fizz"</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>i <span class="token percent-operator operator">%%</span> <span class="token number">5</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span><span class="token string">"Buzz"</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>i<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># When working with files or external resources</span> files <span class="token operator"><-</span> list.files<span class="token punctuation">(</span>pattern <span class="token operator">=</span> <span class="token string">"\\.csv$"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>file <span class="token keyword">in</span> files<span class="token punctuation">)</span> <span class="token punctuation">{</span> data <span class="token operator"><-</span> read.csv<span class="token punctuation">(</span>file<span class="token punctuation">)</span> <span class="token comment"># Process each file differently based on content</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Processed"</span><span class="token punctuation">,</span> file<span class="token punctuation">,</span> <span class="token string">"-"</span><span class="token punctuation">,</span> nrow<span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"rows"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Part 9: Common Mistakes and How to Avoid Them
Mistake 1: Modifying the Iteration Variable
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span class="token comment"># ❌ Don't modify the loop variable</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>i<span class="token punctuation">)</span> i <span class="token operator"><-</span> i <span class="token operator">+</span> <span class="token number">2</span> <span class="token comment"># This won't affect the loop!</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"After modification:"</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Loop still runs for 1,2,3,4,5</span> <span class="token comment"># ✅ The loop variable is automatically updated</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>i<span class="token punctuation">)</span> <span class="token comment"># Don't try to change i</span> <span class="token punctuation">}</span> |
Mistake 2: Growing Objects Inefficiently
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
n <span class="token operator"><-</span> <span class="token number">10000</span> <span class="token comment"># ❌ Very slow - grows vector each iteration</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> results <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> results <span class="token operator"><-</span> c<span class="token punctuation">(</span>results<span class="token punctuation">,</span> i<span class="token operator">^</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token comment"># Creates new vector each time</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment"># ✅ Much faster - pre-allocate</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> results <span class="token operator"><-</span> numeric<span class="token punctuation">(</span>n<span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> results<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> i<span class="token operator">^</span><span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> |
Mistake 3: Off-by-One Errors
|
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 |
<span class="token comment"># ❌ Wrong - tries to access element beyond vector length</span> numbers <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>length<span class="token punctuation">(</span>numbers<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Fine for this case</span> print<span class="token punctuation">(</span>numbers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># But this fails with empty vector:</span> empty <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>length<span class="token punctuation">(</span>empty<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Creates sequence 1:0 = c(1,0)</span> print<span class="token punctuation">(</span>empty<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># Prints NA for i=0</span> <span class="token punctuation">}</span> <span class="token comment"># ✅ Always use seq_along()</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>numbers<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>numbers<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>empty<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># No iterations - good!</span> print<span class="token punctuation">(</span>empty<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Mistake 4: Forgetting to Initialize Results
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment"># ❌ This will cause an error</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> results<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> i<span class="token operator">^</span><span class="token number">2</span> <span class="token comment"># Error: object 'results' not found</span> <span class="token punctuation">}</span> <span class="token comment"># ✅ Initialize first</span> results <span class="token operator"><-</span> numeric<span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token comment"># or results <- c()</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> results<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> i<span class="token operator">^</span><span class="token number">2</span> <span class="token punctuation">}</span> |
Mistake 5: Using For Loops When Vectorized Solutions Exist
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment"># ❌ Don't do this</span> values <span class="token operator"><-</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">1000000</span> sum <span class="token operator"><-</span> <span class="token number">0</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>x <span class="token keyword">in</span> values<span class="token punctuation">)</span> <span class="token punctuation">{</span> sum <span class="token operator"><-</span> sum <span class="token operator">+</span> x <span class="token punctuation">}</span> <span class="token comment"># ✅ Do this</span> sum <span class="token operator"><-</span> sum<span class="token punctuation">(</span>values<span class="token punctuation">)</span> |
Part 10: Advanced For Loop Patterns
Pattern 1: Using Lists of Functions
|
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"># Store different functions in a list</span> operations <span class="token operator"><-</span> list<span class="token punctuation">(</span> square <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> x<span class="token operator">^</span><span class="token number">2</span><span class="token punctuation">,</span> cube <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> x<span class="token operator">^</span><span class="token number">3</span><span class="token punctuation">,</span> sqrt <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> sqrt<span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">,</span> log10 <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> log10<span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment"># Apply each function to a number</span> x <span class="token operator"><-</span> <span class="token number">16</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>op_name <span class="token keyword">in</span> names<span class="token punctuation">(</span>operations<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> result <span class="token operator"><-</span> operations<span class="token punctuation">[</span><span class="token punctuation">[</span>op_name<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span>op_name<span class="token punctuation">,</span> <span class="token string">"of"</span><span class="token punctuation">,</span> x<span class="token punctuation">,</span> <span class="token string">"="</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>result<span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Pattern 2: Parallel Processing with For Loops
|
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 |
<span class="token comment"># Using foreach for parallel loops (requires foreach package)</span> <span class="token comment"># install.packages("foreach")</span> <span class="token comment"># install.packages("doParallel")</span> library<span class="token punctuation">(</span>foreach<span class="token punctuation">)</span> library<span class="token punctuation">(</span>doParallel<span class="token punctuation">)</span> <span class="token comment"># Set up parallel backend</span> cl <span class="token operator"><-</span> makeCluster<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token comment"># Use 2 cores</span> registerDoParallel<span class="token punctuation">(</span>cl<span class="token punctuation">)</span> <span class="token comment"># Parallel for loop</span> results <span class="token operator"><-</span> foreach<span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">10</span><span class="token punctuation">,</span> .combine <span class="token operator">=</span> c<span class="token punctuation">)</span> <span class="token percent-operator operator">%dopar%</span> <span class="token punctuation">{</span> <span class="token comment"># Simulate some work</span> Sys.sleep<span class="token punctuation">(</span><span class="token number">0.1</span><span class="token punctuation">)</span> i<span class="token operator">^</span><span class="token number">2</span> <span class="token punctuation">}</span> <span class="token comment"># Clean up</span> stopCluster<span class="token punctuation">(</span>cl<span class="token punctuation">)</span> print<span class="token punctuation">(</span>results<span class="token punctuation">)</span> |
Pattern 3: Recursive Directory Processing
|
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 |
<span class="token comment"># Function to process files recursively</span> process_directory <span class="token operator"><-</span> <span class="token keyword">function</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> level <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> items <span class="token operator"><-</span> list.files<span class="token punctuation">(</span>path<span class="token punctuation">,</span> full.names <span class="token operator">=</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>item <span class="token keyword">in</span> items<span class="token punctuation">)</span> <span class="token punctuation">{</span> indent <span class="token operator"><-</span> paste<span class="token punctuation">(</span>rep<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">,</span> level<span class="token punctuation">)</span><span class="token punctuation">,</span> collapse <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>file.info<span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token operator">$</span>isdir<span class="token punctuation">)</span> <span class="token punctuation">{</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span>indent<span class="token punctuation">,</span> <span class="token string">"[DIR]"</span><span class="token punctuation">,</span> basename<span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> process_directory<span class="token punctuation">(</span>item<span class="token punctuation">,</span> level <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token comment"># Recursive call</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> size <span class="token operator"><-</span> file.info<span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token operator">$</span>size print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span>indent<span class="token punctuation">,</span> <span class="token string">"[FILE]"</span><span class="token punctuation">,</span> basename<span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"-"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>size<span class="token operator">/</span><span class="token number">1024</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"KB"</span><span class="token punctuation">)</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"># Start processing from current directory</span> process_directory<span class="token punctuation">(</span><span class="token string">"."</span><span class="token punctuation">)</span> |
Summary: The For Loop Philosophy
For loops are your tool for iterating over known sequences. Master these patterns:
-
Basic iteration – Loop over vectors and lists
-
Index-based access – Use indices when you need position
-
Building results – Accumulate results in pre-allocated structures
-
Nested loops – Handle multi-dimensional data
-
Control flow – Use break and next for flexible execution
When to use for loops:
-
Iterating over files or external resources
-
When each iteration depends on previous results
-
Complex processing that can’t be vectorized
-
Learning and teaching programming concepts
When NOT to use for loops:
-
Simple mathematical operations on vectors (use vectorization)
-
When apply functions (lapply, sapply, etc.) are more appropriate
-
Performance-critical code with large datasets
Best practices:
-
Always pre-allocate result vectors/data frames
-
Use
seq_along()instead of1:length() -
Consider vectorized alternatives first
-
Keep loop bodies simple and focused
-
Comment complex logic inside loops
The for loop is like a reliable conveyor belt – it will process each item exactly once, in order, and you can trust it to do the same thing to every item. Master it, and you’ll have a fundamental tool for automating repetitive tasks in R.
Would you like me to elaborate on any specific aspect of for loops or explore more complex real-world examples?
