Chapter 23: R Nested Loops
Part 1: What Are Nested Loops?
A nested loop is simply a loop inside another loop. For each iteration of the outer loop, the inner loop runs completely from start to finish.
The Basic Structure
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token keyword">for</span> <span class="token punctuation">(</span>outer_variable <span class="token keyword">in</span> outer_sequence<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Code before inner loop</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>inner_variable <span class="token keyword">in</span> inner_sequence<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Code that runs for each combination</span> <span class="token comment"># Can use both outer_variable and inner_variable</span> <span class="token punctuation">}</span> <span class="token comment"># Code after inner loop</span> <span class="token punctuation">}</span> |
A Simple Example
|
0 1 2 3 4 5 6 7 8 9 10 |
<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> <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">2</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">"Outer:"</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token string">"Inner:"</span><span class="token punctuation">,</span> j<span class="token punctuation">)</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] "Outer: 1 Inner: 1" [1] "Outer: 1 Inner: 2" [1] "Outer: 2 Inner: 1" [1] "Outer: 2 Inner: 2" [1] "Outer: 3 Inner: 1" [1] "Outer: 3 Inner: 2" |
Let’s trace through what happens:
-
Outer loop i = 1:
-
Inner loop j = 1: prints “Outer: 1 Inner: 1”
-
Inner loop j = 2: prints “Outer: 1 Inner: 2”
-
Inner loop completes
-
-
Outer loop i = 2:
-
Inner loop j = 1: prints “Outer: 2 Inner: 1”
-
Inner loop j = 2: prints “Outer: 2 Inner: 2”
-
Inner loop completes
-
-
Outer loop i = 3:
-
Inner loop j = 1: prints “Outer: 3 Inner: 1”
-
Inner loop j = 2: prints “Outer: 3 Inner: 2”
-
Inner loop completes
-
Total iterations = 3 × 2 = 6 combinations
Part 2: Working with Matrices
Nested loops are perfect for working with 2D structures like matrices:
Creating and Filling a Matrix
|
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 3x4 matrix of zeros</span> my_matrix <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">3</span><span class="token punctuation">,</span> ncol <span class="token operator">=</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token comment"># Fill with values using nested loops</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>row <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>nrow<span class="token punctuation">(</span>my_matrix<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>col <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>ncol<span class="token punctuation">(</span>my_matrix<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> my_matrix<span class="token punctuation">[</span>row<span class="token punctuation">,</span> col<span class="token punctuation">]</span> <span class="token operator"><-</span> row <span class="token operator">*</span> col print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Setting position ["</span><span class="token punctuation">,</span> row<span class="token punctuation">,</span> <span class="token string">","</span><span class="token punctuation">,</span> col<span class="token punctuation">,</span> <span class="token string">"] to"</span><span class="token punctuation">,</span> row <span class="token operator">*</span> col<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> print<span class="token punctuation">(</span><span class="token string">"Final matrix:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>my_matrix<span class="token punctuation">)</span> |
Output (final matrix):
|
0 1 2 3 4 5 6 7 8 9 |
[,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 2 4 6 8 [3,] 3 6 9 12 |
Matrix Operations
|
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 |
<span class="token comment"># Create two matrices</span> A <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">6</span><span class="token punctuation">,</span> nrow <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">,</span> ncol <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">)</span> B <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">7</span><span class="token operator">:</span><span class="token number">12</span><span class="token punctuation">,</span> nrow <span class="token operator">=</span> <span class="token number">2</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">"Matrix A:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>A<span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Matrix B:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>B<span class="token punctuation">)</span> <span class="token comment"># Add matrices using nested loops</span> result <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">2</span><span class="token punctuation">,</span> ncol <span class="token operator">=</span> <span class="token number">3</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>nrow<span class="token punctuation">(</span>A<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>A<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> result<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator"><-</span> A<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator">+</span> B<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">"Adding A["</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> A<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">"+ B["</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> B<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">"="</span><span class="token punctuation">,</span> result<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<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> print<span class="token punctuation">(</span><span class="token string">"Result of A + B:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>result<span class="token punctuation">)</span> <span class="token comment"># Verify with R's built-in operation</span> print<span class="token punctuation">(</span><span class="token string">"Using R's built-in + operator:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>A <span class="token operator">+</span> B<span class="token punctuation">)</span> |
Part 3: Multiplication Table – A Classic Example
Let’s create a comprehensive multiplication table with formatting:
|
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 |
<span class="token comment"># Create a 12x12 multiplication table</span> size <span class="token operator"><-</span> <span class="token number">12</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> size<span class="token punctuation">,</span> ncol <span class="token operator">=</span> size<span class="token punctuation">)</span> <span class="token comment"># Calculate the table</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>size<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>size<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 with formatting</span> print<span class="token punctuation">(</span><span class="token string">"Multiplication Table (1-12):"</span><span class="token punctuation">)</span> cat<span class="token punctuation">(</span><span class="token string">"\n "</span><span class="token punctuation">)</span> <span class="token comment"># Header spacing</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>size<span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span>sprintf<span class="token punctuation">(</span><span class="token string">"%4d"</span><span class="token punctuation">,</span> j<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> cat<span class="token punctuation">(</span><span class="token string">"\n "</span> <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> size<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 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>size<span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span>sprintf<span class="token punctuation">(</span><span class="token string">"\n%2d |"</span><span class="token punctuation">,</span> i<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>size<span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span>sprintf<span class="token punctuation">(</span><span class="token string">"%4d"</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 punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Output (partial):
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Multiplication Table (1-12): 1 2 3 4 5 6 7 8 9 10 11 12 -------------------------------------------------- 1 | 1 2 3 4 5 6 7 8 9 10 11 12 2 | 2 4 6 8 10 12 14 16 18 20 22 24 3 | 3 6 9 12 15 18 21 24 27 30 33 36 4 | 4 8 12 16 20 24 28 32 36 40 44 48 ... |
Interactive Multiplication Quiz
|
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 |
<span class="token comment"># Create a fun multiplication quiz</span> generate_quiz <span class="token operator"><-</span> <span class="token keyword">function</span><span class="token punctuation">(</span>size <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"Welcome to the Multiplication Quiz!\n"</span><span class="token punctuation">)</span> cat<span class="token punctuation">(</span><span class="token string">"Answer these"</span><span class="token punctuation">,</span> size<span class="token punctuation">,</span> <span class="token string">"questions:\n\n"</span><span class="token punctuation">)</span> score <span class="token operator"><-</span> <span class="token number">0</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>size<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Generate random numbers</span> a <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">12</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> b <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">12</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> correct <span class="token operator"><-</span> a <span class="token operator">*</span> b <span class="token comment"># Ask question</span> cat<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Question"</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token string">":"</span><span class="token punctuation">,</span> a<span class="token punctuation">,</span> <span class="token string">"x"</span><span class="token punctuation">,</span> b<span class="token punctuation">,</span> <span class="token string">"= "</span><span class="token punctuation">)</span><span class="token punctuation">)</span> answer <span class="token operator"><-</span> as.numeric<span class="token punctuation">(</span>readline<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Check answer</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>is.na<span class="token punctuation">(</span>answer<span class="token punctuation">)</span> <span class="token operator">&&</span> answer <span class="token operator">==</span> correct<span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"✓ Correct!\n"</span><span class="token punctuation">)</span> score <span class="token operator"><-</span> score <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"✗ Wrong. The correct answer is"</span><span class="token punctuation">,</span> correct<span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> cat<span class="token punctuation">(</span><span class="token string">"\nQuiz complete! Your score:"</span><span class="token punctuation">,</span> score<span class="token punctuation">,</span> <span class="token string">"out of"</span><span class="token punctuation">,</span> size<span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">)</span> percentage <span class="token operator"><-</span> round<span class="token punctuation">(</span>score <span class="token operator">/</span> size <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> cat<span class="token punctuation">(</span><span class="token string">"Percentage:"</span><span class="token punctuation">,</span> percentage<span class="token punctuation">,</span> <span class="token string">"%\n"</span><span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>percentage <span class="token operator">==</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"Perfect score! Excellent! 🏆\n"</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>percentage <span class="token operator">>=</span> <span class="token number">80</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"Great job! Keep practicing! ⭐\n"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"Keep practicing! You'll get better! 💪\n"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># Run the quiz</span> <span class="token comment"># generate_quiz(5) # Uncomment to run interactively</span> |
Part 4: Pattern Printing with Nested Loops
Nested loops are excellent for creating visual patterns:
Right Triangle Pattern
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment"># Print a right triangle</span> height <span class="token operator"><-</span> <span class="token number">5</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>height<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>i<span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"* "</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> cat<span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 |
* * * * * * * * * * * * * * * |
Inverted Triangle
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
height <span class="token operator"><-</span> <span class="token number">5</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> height<span class="token operator">:</span><span class="token number">1</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>i<span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"* "</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> cat<span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 |
* * * * * * * * * * * * * * * |
Pyramid Pattern
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
height <span class="token operator"><-</span> <span class="token number">5</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>height<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Print spaces</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 punctuation">(</span>height <span class="token operator">-</span> i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Print stars</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 punctuation">(</span><span class="token number">2</span><span class="token operator">*</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"*"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> cat<span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Output:
|
0 1 2 3 4 5 6 7 8 9 10 |
* *** ***** ******* ********* |
Diamond Pattern
|
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 |
height <span class="token operator"><-</span> <span class="token number">5</span> <span class="token comment"># Top half (including middle)</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>height<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Spaces</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 punctuation">(</span>height <span class="token operator">-</span> i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Stars</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 punctuation">(</span><span class="token number">2</span><span class="token operator">*</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"*"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> cat<span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Bottom half</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token punctuation">(</span>height<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">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Spaces</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 punctuation">(</span>height <span class="token operator">-</span> i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Stars</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 punctuation">(</span><span class="token number">2</span><span class="token operator">*</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"*"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> cat<span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Part 5: Working with Data Frames
Nested loops are useful for complex data frame operations:
Student Grade 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 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<span class="token comment"># Create a gradebook</span> set.seed<span class="token punctuation">(</span><span class="token number">123</span><span class="token punctuation">)</span> students <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> subjects <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token string">"Math"</span><span class="token punctuation">,</span> <span class="token string">"Science"</span><span class="token punctuation">,</span> <span class="token string">"English"</span><span class="token punctuation">,</span> <span class="token string">"History"</span><span class="token punctuation">)</span> gradebook <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> Student <span class="token operator">=</span> rep<span class="token punctuation">(</span>students<span class="token punctuation">,</span> each <span class="token operator">=</span> length<span class="token punctuation">(</span>subjects<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> Subject <span class="token operator">=</span> rep<span class="token punctuation">(</span>subjects<span class="token punctuation">,</span> times <span class="token operator">=</span> length<span class="token punctuation">(</span>students<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> Score <span class="token operator">=</span> sample<span class="token punctuation">(</span><span class="token number">60</span><span class="token operator">:</span><span class="token number">100</span><span class="token punctuation">,</span> length<span class="token punctuation">(</span>students<span class="token punctuation">)</span> <span class="token operator">*</span> length<span class="token punctuation">(</span>subjects<span class="token punctuation">)</span><span class="token punctuation">,</span> replace <span class="token operator">=</span> <span class="token boolean">TRUE</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">"Gradebook:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>gradebook<span class="token punctuation">)</span> <span class="token comment"># Analyze grades by student and subject</span> cat<span class="token punctuation">(</span><span class="token string">"\n--- Grade Analysis ---\n"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>student <span class="token keyword">in</span> unique<span class="token punctuation">(</span>gradebook<span class="token operator">$</span>Student<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"\nStudent:"</span><span class="token punctuation">,</span> student<span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">)</span> cat<span class="token punctuation">(</span><span class="token string">"----------------\n"</span><span class="token punctuation">)</span> student_total <span class="token operator"><-</span> <span class="token number">0</span> student_count <span class="token operator"><-</span> <span class="token number">0</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>subject <span class="token keyword">in</span> unique<span class="token punctuation">(</span>gradebook<span class="token operator">$</span>Subject<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Find the score for this student and subject</span> score <span class="token operator"><-</span> gradebook<span class="token operator">$</span>Score<span class="token punctuation">[</span>gradebook<span class="token operator">$</span>Student <span class="token operator">==</span> student <span class="token operator">&</span> gradebook<span class="token operator">$</span>Subject <span class="token operator">==</span> subject<span class="token punctuation">]</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>length<span class="token punctuation">(</span>score<span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span>sprintf<span class="token punctuation">(</span><span class="token string">" %-10s: %3d - %s\n"</span><span class="token punctuation">,</span> subject<span class="token punctuation">,</span> score<span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">90</span><span class="token punctuation">,</span> <span class="token string">"A"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">80</span><span class="token punctuation">,</span> <span class="token string">"B"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">70</span><span class="token punctuation">,</span> <span class="token string">"C"</span><span class="token punctuation">,</span> ifelse<span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token string">"D"</span><span class="token punctuation">,</span> <span class="token string">"F"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> student_total <span class="token operator"><-</span> student_total <span class="token operator">+</span> score student_count <span class="token operator"><-</span> student_count <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>student_count <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> avg <span class="token operator"><-</span> student_total <span class="token operator">/</span> student_count cat<span class="token punctuation">(</span>sprintf<span class="token punctuation">(</span><span class="token string">" Average : %.1f\n"</span><span class="token punctuation">,</span> avg<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Cross-Tabulation
|
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 |
<span class="token comment"># Create a cross-tabulation manually</span> create_crosstab <span class="token operator"><-</span> <span class="token keyword">function</span><span class="token punctuation">(</span>data<span class="token punctuation">,</span> row_var<span class="token punctuation">,</span> col_var<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Get unique values</span> row_values <span class="token operator"><-</span> unique<span class="token punctuation">(</span>data<span class="token punctuation">[</span><span class="token punctuation">[</span>row_var<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span> col_values <span class="token operator"><-</span> unique<span class="token punctuation">(</span>data<span class="token punctuation">[</span><span class="token punctuation">[</span>col_var<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># Create empty matrix</span> result <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> length<span class="token punctuation">(</span>row_values<span class="token punctuation">)</span><span class="token punctuation">,</span> ncol <span class="token operator">=</span> length<span class="token punctuation">(</span>col_values<span class="token punctuation">)</span><span class="token punctuation">)</span> rownames<span class="token punctuation">(</span>result<span class="token punctuation">)</span> <span class="token operator"><-</span> row_values colnames<span class="token punctuation">(</span>result<span class="token punctuation">)</span> <span class="token operator"><-</span> col_values <span class="token comment"># Fill the matrix</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>row_values<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> seq_along<span class="token punctuation">(</span>col_values<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> result<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator"><-</span> sum<span class="token punctuation">(</span>data<span class="token punctuation">[</span><span class="token punctuation">[</span>row_var<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">==</span> row_values<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">&</span> data<span class="token punctuation">[</span><span class="token punctuation">[</span>col_var<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">==</span> col_values<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> return<span class="token punctuation">(</span>result<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Test with our gradebook</span> crosstab <span class="token operator"><-</span> create_crosstab<span class="token punctuation">(</span>gradebook<span class="token punctuation">,</span> <span class="token string">"Student"</span><span class="token punctuation">,</span> <span class="token string">"Subject"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Student by Subject count:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>crosstab<span class="token punctuation">)</span> |
Part 6: Three-Level Nested Loops
Sometimes you need even deeper nesting for 3D data:
Creating a 3D Array
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<span class="token comment"># Create a 3x4x2 array (rows, columns, layers)</span> depth <span class="token operator"><-</span> <span class="token number">2</span> rows <span class="token operator"><-</span> <span class="token number">3</span> cols <span class="token operator"><-</span> <span class="token number">4</span> <span class="token comment"># Create empty 3D array</span> my_3d_array <span class="token operator"><-</span> array<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> dim <span class="token operator">=</span> c<span class="token punctuation">(</span>rows<span class="token punctuation">,</span> cols<span class="token punctuation">,</span> depth<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Fill with values</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>k <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>depth<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>rows<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>cols<span class="token punctuation">)</span> <span class="token punctuation">{</span> my_3d_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> k<span class="token punctuation">]</span> <span class="token operator"><-</span> i <span class="token operator">*</span> j <span class="token operator">*</span> k print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"Layer"</span><span class="token punctuation">,</span> k<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">","</span><span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token string">"] ="</span><span class="token punctuation">,</span> my_3d_array<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> k<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 punctuation">}</span> print<span class="token punctuation">(</span><span class="token string">"3D Array Structure:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>my_3d_array<span class="token punctuation">)</span> |
Analyzing 3D Data
|
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 |
<span class="token comment"># Simulate temperature readings across multiple sensors over time</span> set.seed<span class="token punctuation">(</span><span class="token number">789</span><span class="token punctuation">)</span> days <span class="token operator"><-</span> <span class="token number">7</span> hours <span class="token operator"><-</span> <span class="token number">24</span> sensors <span class="token operator"><-</span> <span class="token number">3</span> <span class="token comment"># temperatures[sensor, hour, day]</span> temperatures <span class="token operator"><-</span> array<span class="token punctuation">(</span> runif<span class="token punctuation">(</span>days <span class="token operator">*</span> hours <span class="token operator">*</span> sensors<span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">,</span> dim <span class="token operator">=</span> c<span class="token punctuation">(</span>sensors<span class="token punctuation">,</span> hours<span class="token punctuation">,</span> days<span class="token punctuation">)</span> <span class="token punctuation">)</span> dimnames<span class="token punctuation">(</span>temperatures<span class="token punctuation">)</span> <span class="token operator"><-</span> list<span class="token punctuation">(</span> paste<span class="token punctuation">(</span><span class="token string">"Sensor"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token operator">:</span>sensors<span class="token punctuation">)</span><span class="token punctuation">,</span> paste0<span class="token punctuation">(</span><span class="token string">"H"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token operator">:</span>hours<span class="token punctuation">)</span><span class="token punctuation">,</span> paste<span class="token punctuation">(</span><span class="token string">"Day"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token operator">:</span>days<span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment"># Calculate daily averages per sensor</span> cat<span class="token punctuation">(</span><span class="token string">"Daily Temperature Averages by Sensor:\n\n"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>sensor <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>sensors<span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"\nSensor"</span><span class="token punctuation">,</span> sensor<span class="token punctuation">,</span> <span class="token string">":\n"</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>days<span class="token punctuation">)</span> <span class="token punctuation">{</span> daily_total <span class="token operator"><-</span> <span class="token number">0</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>hour <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>hours<span class="token punctuation">)</span> <span class="token punctuation">{</span> daily_total <span class="token operator"><-</span> daily_total <span class="token operator">+</span> temperatures<span class="token punctuation">[</span>sensor<span class="token punctuation">,</span> hour<span class="token punctuation">,</span> day<span class="token punctuation">]</span> <span class="token punctuation">}</span> daily_avg <span class="token operator"><-</span> daily_total <span class="token operator">/</span> hours cat<span class="token punctuation">(</span>sprintf<span class="token punctuation">(</span><span class="token string">" Day %d: %.1f°C\n"</span><span class="token punctuation">,</span> day<span class="token punctuation">,</span> daily_avg<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Part 7: Performance Considerations
The Cost of Deep Nesting
Nested loops can become very slow as dimensions grow:
|
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"># Demonstrate performance impact</span> compare_nested_performance <span class="token operator"><-</span> <span class="token keyword">function</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"\nTesting with n ="</span><span class="token punctuation">,</span> n<span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">)</span> <span class="token comment"># 2-level nesting</span> time_2d <span class="token operator"><-</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> result <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<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> <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>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> result<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 punctuation">}</span><span class="token punctuation">)</span> cat<span class="token punctuation">(</span><span class="token string">"2D nested (n² ="</span><span class="token punctuation">,</span> n<span class="token operator">^</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"iterations):"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>time_2d<span class="token punctuation">[</span><span class="token string">"elapsed"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"sec\n"</span><span class="token punctuation">)</span> <span class="token comment"># 3-level nesting (smaller n to be reasonable)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>n <span class="token operator"><=</span> <span class="token number">30</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> time_3d <span class="token operator"><-</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> result <span class="token operator"><-</span> array<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> dim <span class="token operator">=</span> c<span class="token punctuation">(</span>n<span class="token punctuation">,</span> n<span class="token punctuation">,</span> n<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> <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>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>k <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> result<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> k<span class="token punctuation">]</span> <span class="token operator"><-</span> i <span class="token operator">*</span> j <span class="token operator">*</span> k <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> cat<span class="token punctuation">(</span><span class="token string">"3D nested (n³ ="</span><span class="token punctuation">,</span> n<span class="token operator">^</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">"iterations):"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>time_3d<span class="token punctuation">[</span><span class="token string">"elapsed"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"sec\n"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> compare_nested_performance<span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span> compare_nested_performance<span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span> compare_nested_performance<span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span> |
Optimization Techniques
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<span class="token comment"># 1. Pre-allocate memory</span> n <span class="token operator"><-</span> <span class="token number">100</span> <span class="token comment"># ❌ Slow - growing inside loops</span> slow_matrix <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">,</span> n<span class="token punctuation">)</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> result <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> <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>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> result <span class="token operator"><-</span> c<span class="token punctuation">(</span>result<span class="token punctuation">,</span> i<span class="token operator">*</span>j<span class="token punctuation">)</span> <span class="token comment"># Reallocates each time!</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"># ✅ Fast - pre-allocated</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> result <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<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> <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>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> result<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 punctuation">}</span><span class="token punctuation">)</span> <span class="token comment"># 2. Move invariant calculations outside inner loop</span> n <span class="token operator"><-</span> <span class="token number">1000</span> <span class="token comment"># ❌ Slow - recalculating each time</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> result <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<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> <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>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> result<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 operator">*</span> <span class="token punctuation">(</span>i <span class="token operator">+</span> j<span class="token punctuation">)</span> <span class="token comment"># i+j recalculated many times</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"># ✅ Fast - calculate once per i</span> system.time<span class="token punctuation">(</span><span class="token punctuation">{</span> result <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<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> i_plus_j_template <span class="token operator"><-</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token operator">:</span>n <span class="token comment"># Calculate once per i</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>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> result<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 operator">*</span> i_plus_j_template<span class="token punctuation">[</span>j<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> |
Part 8: Real-World Examples
Example 1: Image Processing – Grayscale Conversion
|
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 |
<span class="token comment"># Simulate an RGB image (3D array: height x width x channels)</span> set.seed<span class="token punctuation">(</span><span class="token number">123</span><span class="token punctuation">)</span> height <span class="token operator"><-</span> <span class="token number">5</span> width <span class="token operator"><-</span> <span class="token number">8</span> <span class="token comment"># Create random RGB values (0-255)</span> rgb_image <span class="token operator"><-</span> array<span class="token punctuation">(</span> sample<span class="token punctuation">(</span><span class="token number">0</span><span class="token operator">:</span><span class="token number">255</span><span class="token punctuation">,</span> height <span class="token operator">*</span> width <span class="token operator">*</span> <span class="token number">3</span><span class="token punctuation">,</span> replace <span class="token operator">=</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span><span class="token punctuation">,</span> dim <span class="token operator">=</span> c<span class="token punctuation">(</span>height<span class="token punctuation">,</span> width<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token comment"># Add dimension names for clarity</span> dimnames<span class="token punctuation">(</span>rgb_image<span class="token punctuation">)</span> <span class="token operator"><-</span> list<span class="token punctuation">(</span> paste<span class="token punctuation">(</span><span class="token string">"Row"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token operator">:</span>height<span class="token punctuation">)</span><span class="token punctuation">,</span> paste<span class="token punctuation">(</span><span class="token string">"Col"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token operator">:</span>width<span class="token punctuation">)</span><span class="token punctuation">,</span> c<span class="token punctuation">(</span><span class="token string">"Red"</span><span class="token punctuation">,</span> <span class="token string">"Green"</span><span class="token punctuation">,</span> <span class="token string">"Blue"</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> cat<span class="token punctuation">(</span><span class="token string">"Original RGB image (first few pixels):\n"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>rgb_image<span class="token punctuation">[</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 number">1</span><span class="token operator">:</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># Convert to grayscale using nested loops</span> grayscale <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> height<span class="token punctuation">,</span> width<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>height<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>width<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Standard grayscale formula: 0.299*R + 0.587*G + 0.114*B</span> r <span class="token operator"><-</span> rgb_image<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span> g <span class="token operator"><-</span> rgb_image<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span> b <span class="token operator"><-</span> rgb_image<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span> grayscale<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator"><-</span> round<span class="token punctuation">(</span><span class="token number">0.299</span> <span class="token operator">*</span> r <span class="token operator">+</span> <span class="token number">0.587</span> <span class="token operator">*</span> g <span class="token operator">+</span> <span class="token number">0.114</span> <span class="token operator">*</span> b<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> cat<span class="token punctuation">(</span><span class="token string">"\nGrayscale image:\n"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>grayscale<span class="token punctuation">)</span> |
Example 2: Game of Life 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<span class="token comment"># Conway's Game of Life simulation</span> game_of_life <span class="token operator"><-</span> <span class="token keyword">function</span><span class="token punctuation">(</span>initial_grid<span class="token punctuation">,</span> generations <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> rows <span class="token operator"><-</span> nrow<span class="token punctuation">(</span>initial_grid<span class="token punctuation">)</span> cols <span class="token operator"><-</span> ncol<span class="token punctuation">(</span>initial_grid<span class="token punctuation">)</span> <span class="token comment"># Pad grid with zeros for boundary handling</span> grid <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> rows <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">,</span> cols <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">)</span> grid<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">:</span><span class="token punctuation">(</span>rows<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token operator">:</span><span class="token punctuation">(</span>cols<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token operator"><-</span> initial_grid <span class="token keyword">for</span> <span class="token punctuation">(</span>gen <span class="token keyword">in</span> <span class="token number">1</span><span class="token operator">:</span>generations<span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"\nGeneration"</span><span class="token punctuation">,</span> gen<span class="token punctuation">,</span> <span class="token string">":\n"</span><span class="token punctuation">)</span> new_grid <span class="token operator"><-</span> grid <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">2</span><span class="token operator">:</span><span class="token punctuation">(</span>rows<span class="token operator">+</span><span class="token number">1</span><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">2</span><span class="token operator">:</span><span class="token punctuation">(</span>cols<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Count live neighbors</span> neighbors <span class="token operator"><-</span> sum<span class="token punctuation">(</span>grid<span class="token punctuation">[</span><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><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 punctuation">,</span> <span class="token punctuation">(</span>j<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token punctuation">(</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span> grid<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token comment"># Apply Game of Life rules</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>grid<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Live cell</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>neighbors <span class="token operator"><</span> <span class="token number">2</span> <span class="token operator">||</span> neighbors <span class="token operator">></span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> new_grid<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator"><-</span> <span class="token number">0</span> <span class="token comment"># Dies</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment"># Dead cell</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>neighbors <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> new_grid<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator"><-</span> <span class="token number">1</span> <span class="token comment"># Becomes alive</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> grid <span class="token operator"><-</span> new_grid <span class="token comment"># Display grid</span> display_grid <span class="token operator"><-</span> grid<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">:</span><span class="token punctuation">(</span>rows<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token operator">:</span><span class="token punctuation">(</span>cols<span class="token operator">+</span><span class="token number">1</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> <span class="token number">1</span><span class="token operator">:</span>rows<span class="token punctuation">)</span> <span class="token punctuation">{</span> row_str <span class="token operator"><-</span> paste<span class="token punctuation">(</span>ifelse<span class="token punctuation">(</span>display_grid<span class="token punctuation">[</span>i<span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">"■"</span><span class="token punctuation">,</span> <span class="token string">"□"</span><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> cat<span class="token punctuation">(</span>row_str<span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> return<span class="token punctuation">(</span>grid<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">:</span><span class="token punctuation">(</span>rows<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token operator">:</span><span class="token punctuation">(</span>cols<span class="token operator">+</span><span class="token number">1</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"># Initial pattern: glider</span> initial <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span> initial<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator"><-</span> <span class="token number">1</span> initial<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator"><-</span> <span class="token number">1</span> initial<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token operator">:</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator"><-</span> <span class="token number">1</span> result <span class="token operator"><-</span> game_of_life<span class="token punctuation">(</span>initial<span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span> |
Example 3: Pairwise Distance Matrix
|
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 |
<span class="token comment"># Calculate pairwise distances between points</span> set.seed<span class="token punctuation">(</span><span class="token number">456</span><span class="token punctuation">)</span> n_points <span class="token operator"><-</span> <span class="token number">5</span> points <span class="token operator"><-</span> data.frame<span class="token punctuation">(</span> x <span class="token operator">=</span> runif<span class="token punctuation">(</span>n_points<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span> y <span class="token operator">=</span> runif<span class="token punctuation">(</span>n_points<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Points:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>points<span class="token punctuation">)</span> <span class="token comment"># Create distance matrix</span> distance_matrix <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n_points<span class="token punctuation">,</span> n_points<span class="token punctuation">)</span> rownames<span class="token punctuation">(</span>distance_matrix<span class="token punctuation">)</span> <span class="token operator"><-</span> paste0<span class="token punctuation">(</span><span class="token string">"P"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token operator">:</span>n_points<span class="token punctuation">)</span> colnames<span class="token punctuation">(</span>distance_matrix<span class="token punctuation">)</span> <span class="token operator"><-</span> paste0<span class="token punctuation">(</span><span class="token string">"P"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token operator">:</span>n_points<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_points<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>n_points<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 operator">!=</span> j<span class="token punctuation">)</span> <span class="token punctuation">{</span> dx <span class="token operator"><-</span> points<span class="token operator">$</span>x<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">-</span> points<span class="token operator">$</span>x<span class="token punctuation">[</span>j<span class="token punctuation">]</span> dy <span class="token operator"><-</span> points<span class="token operator">$</span>y<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">-</span> points<span class="token operator">$</span>y<span class="token punctuation">[</span>j<span class="token punctuation">]</span> distance_matrix<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator"><-</span> sqrt<span class="token punctuation">(</span>dx<span class="token operator">^</span><span class="token number">2</span> <span class="token operator">+</span> dy<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 punctuation">}</span> print<span class="token punctuation">(</span><span class="token string">"\nPairwise Distance Matrix:"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span>round<span class="token punctuation">(</span>distance_matrix<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Find closest pair</span> min_dist <span class="token operator"><-</span> min<span class="token punctuation">(</span>distance_matrix<span class="token punctuation">[</span>distance_matrix <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> closest <span class="token operator"><-</span> which<span class="token punctuation">(</span>distance_matrix <span class="token operator">==</span> min_dist<span class="token punctuation">,</span> arr.ind <span class="token operator">=</span> <span class="token boolean">TRUE</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> cat<span class="token punctuation">(</span><span class="token string">"\nClosest points:"</span><span class="token punctuation">,</span> rownames<span class="token punctuation">(</span>distance_matrix<span class="token punctuation">)</span><span class="token punctuation">[</span>closest<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> <span class="token string">"and"</span><span class="token punctuation">,</span> colnames<span class="token punctuation">(</span>distance_matrix<span class="token punctuation">)</span><span class="token punctuation">[</span>closest<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 string">"- Distance:"</span><span class="token punctuation">,</span> round<span class="token punctuation">(</span>min_dist<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span> |
Example 4: Weather Data 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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
<span class="token comment"># Simulate weather data for multiple cities over time</span> cities <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token string">"New York"</span><span class="token punctuation">,</span> <span class="token string">"Los Angeles"</span><span class="token punctuation">,</span> <span class="token string">"Chicago"</span><span class="token punctuation">,</span> <span class="token string">"Houston"</span><span class="token punctuation">,</span> <span class="token string">"Phoenix"</span><span class="token punctuation">)</span> months <span class="token operator"><-</span> c<span class="token punctuation">(</span><span class="token string">"Jan"</span><span class="token punctuation">,</span> <span class="token string">"Feb"</span><span class="token punctuation">,</span> <span class="token string">"Mar"</span><span class="token punctuation">,</span> <span class="token string">"Apr"</span><span class="token punctuation">,</span> <span class="token string">"May"</span><span class="token punctuation">,</span> <span class="token string">"Jun"</span><span class="token punctuation">,</span> <span class="token string">"Jul"</span><span class="token punctuation">,</span> <span class="token string">"Aug"</span><span class="token punctuation">,</span> <span class="token string">"Sep"</span><span class="token punctuation">,</span> <span class="token string">"Oct"</span><span class="token punctuation">,</span> <span class="token string">"Nov"</span><span class="token punctuation">,</span> <span class="token string">"Dec"</span><span class="token punctuation">)</span> years <span class="token operator"><-</span> <span class="token number">2020</span><span class="token operator">:</span><span class="token number">2023</span> <span class="token comment"># Create 3D array: [city, month, year]</span> set.seed<span class="token punctuation">(</span><span class="token number">789</span><span class="token punctuation">)</span> temps <span class="token operator"><-</span> array<span class="token punctuation">(</span> runif<span class="token punctuation">(</span>length<span class="token punctuation">(</span>cities<span class="token punctuation">)</span> <span class="token operator">*</span> length<span class="token punctuation">(</span>months<span class="token punctuation">)</span> <span class="token operator">*</span> length<span class="token punctuation">(</span>years<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">35</span><span class="token punctuation">)</span><span class="token punctuation">,</span> dim <span class="token operator">=</span> c<span class="token punctuation">(</span>length<span class="token punctuation">(</span>cities<span class="token punctuation">)</span><span class="token punctuation">,</span> length<span class="token punctuation">(</span>months<span class="token punctuation">)</span><span class="token punctuation">,</span> length<span class="token punctuation">(</span>years<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> dimnames<span class="token punctuation">(</span>temps<span class="token punctuation">)</span> <span class="token operator"><-</span> list<span class="token punctuation">(</span>cities<span class="token punctuation">,</span> months<span class="token punctuation">,</span> as.character<span class="token punctuation">(</span>years<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Analyze temperature patterns</span> cat<span class="token punctuation">(</span><span class="token string">"Climate Analysis:\n\n"</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>city <span class="token keyword">in</span> cities<span class="token punctuation">)</span> <span class="token punctuation">{</span> cat<span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">,</span> city<span class="token punctuation">,</span> <span class="token string">":\n"</span><span class="token punctuation">,</span> sep <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">)</span> cat<span class="token punctuation">(</span><span class="token string">"----------------\n"</span><span class="token punctuation">)</span> <span class="token comment"># Calculate yearly averages</span> yearly_avgs <span class="token operator"><-</span> numeric<span class="token punctuation">(</span>length<span class="token punctuation">(</span>years<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>y_idx <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>years<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> year_total <span class="token operator"><-</span> <span class="token number">0</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>m_idx <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>months<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> year_total <span class="token operator"><-</span> year_total <span class="token operator">+</span> temps<span class="token punctuation">[</span>city<span class="token punctuation">,</span> m_idx<span class="token punctuation">,</span> y_idx<span class="token punctuation">]</span> <span class="token punctuation">}</span> yearly_avgs<span class="token punctuation">[</span>y_idx<span class="token punctuation">]</span> <span class="token operator"><-</span> year_total <span class="token operator">/</span> length<span class="token punctuation">(</span>months<span class="token punctuation">)</span> cat<span class="token punctuation">(</span>sprintf<span class="token punctuation">(</span><span class="token string">" %d average: %.1f°C\n"</span><span class="token punctuation">,</span> years<span class="token punctuation">[</span>y_idx<span class="token punctuation">]</span><span class="token punctuation">,</span> yearly_avgs<span class="token punctuation">[</span>y_idx<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment"># Find warmest and coldest months overall</span> warmest_temp <span class="token operator"><-</span> <span class="token operator">-</span><span class="token number">Inf</span> warmest_month <span class="token operator"><-</span> <span class="token string">""</span> warmest_year <span class="token operator"><-</span> <span class="token string">""</span> coldest_temp <span class="token operator"><-</span> <span class="token number">Inf</span> coldest_month <span class="token operator"><-</span> <span class="token string">""</span> coldest_year <span class="token operator"><-</span> <span class="token string">""</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>y_idx <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>years<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>m_idx <span class="token keyword">in</span> seq_along<span class="token punctuation">(</span>months<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> current_temp <span class="token operator"><-</span> temps<span class="token punctuation">[</span>city<span class="token punctuation">,</span> m_idx<span class="token punctuation">,</span> y_idx<span class="token punctuation">]</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>current_temp <span class="token operator">></span> warmest_temp<span class="token punctuation">)</span> <span class="token punctuation">{</span> warmest_temp <span class="token operator"><-</span> current_temp warmest_month <span class="token operator"><-</span> months<span class="token punctuation">[</span>m_idx<span class="token punctuation">]</span> warmest_year <span class="token operator"><-</span> years<span class="token punctuation">[</span>y_idx<span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>current_temp <span class="token operator"><</span> coldest_temp<span class="token punctuation">)</span> <span class="token punctuation">{</span> coldest_temp <span class="token operator"><-</span> current_temp coldest_month <span class="token operator"><-</span> months<span class="token punctuation">[</span>m_idx<span class="token punctuation">]</span> coldest_year <span class="token operator"><-</span> years<span class="token punctuation">[</span>y_idx<span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> cat<span class="token punctuation">(</span>sprintf<span class="token punctuation">(</span><span class="token string">" Warmest: %.1f°C (%s %s)\n"</span><span class="token punctuation">,</span> warmest_temp<span class="token punctuation">,</span> warmest_month<span class="token punctuation">,</span> warmest_year<span class="token punctuation">)</span><span class="token punctuation">)</span> cat<span class="token punctuation">(</span>sprintf<span class="token punctuation">(</span><span class="token string">" Coldest: %.1f°C (%s %s)\n"</span><span class="token punctuation">,</span> coldest_temp<span class="token punctuation">,</span> coldest_month<span class="token punctuation">,</span> coldest_year<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># Temperature range</span> cat<span class="token punctuation">(</span>sprintf<span class="token punctuation">(</span><span class="token string">" Range: %.1f°C\n"</span><span class="token punctuation">,</span> warmest_temp <span class="token operator">-</span> coldest_temp<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: Variable Name Conflicts
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment"># ❌ Using same variable name in nested loops</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> <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">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># This overwrites the outer i!</span> print<span class="token punctuation">(</span>paste<span class="token punctuation">(</span><span class="token string">"i ="</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 punctuation">}</span> <span class="token comment"># Output shows only inner loop values</span> <span class="token comment"># ✅ Use distinct variable names</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> <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">2</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">"Outer i ="</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token string">"Inner j ="</span><span class="token punctuation">,</span> j<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Mistake 2: Wrong Loop Order
|
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"># ❌ Wrong order for matrix filling (column-major vs row-major)</span> matrix_wrong <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">3</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">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Columns outer</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> <span class="token comment"># Rows inner</span> matrix_wrong<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"># ✅ Usually want rows outer for readability</span> matrix_correct <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">3</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">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Rows outer</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">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Columns inner</span> matrix_correct<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> |
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 26 27 28 29 |
<span class="token comment"># ❌ Wrong indices</span> n <span class="token operator"><-</span> <span class="token number">5</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> <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>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Using i and j as indices is fine</span> <span class="token comment"># But be careful with i-1 or i+1 at boundaries</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">></span> <span class="token number">1</span> <span class="token operator">&&</span> j <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># This is safe</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># ✅ Handle boundaries properly</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> <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>n<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Check boundaries before accessing adjacent cells</span> <span class="token keyword">if</span> <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 punctuation">{</span> <span class="token comment"># Can access [i-1, j]</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator"><</span> n<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Can access [i+1, j]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Mistake 4: Inefficient Order
|
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 |
<span class="token comment"># ❌ Inner loop with more iterations is usually better as inner loop</span> n_rows <span class="token operator"><-</span> <span class="token number">10</span> n_cols <span class="token operator"><-</span> <span class="token number">10000</span> matrix_data <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n_rows<span class="token punctuation">,</span> n_cols<span class="token punctuation">)</span> <span class="token comment"># Slow: inner loop runs many times</span> system.time<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>n_cols<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Outer: 10000 iterations</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_rows<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Inner: 10 iterations</span> matrix_data<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 punctuation">}</span><span class="token punctuation">)</span> <span class="token comment"># Fast: inner loop runs fewer times</span> system.time<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_rows<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Outer: 10 iterations</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>n_cols<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># Inner: 10000 iterations</span> matrix_data<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 punctuation">}</span><span class="token punctuation">)</span> |
Mistake 5: Modifying the Iteration Variable
|
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"># ❌ Don't modify loop variables</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> <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">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>some_condition<span class="token punctuation">)</span> <span class="token punctuation">{</span> j <span class="token operator"><-</span> j <span class="token operator">+</span> <span class="token number">2</span> <span class="token comment"># This won't affect the loop!</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># ✅ Use control statements instead</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> <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">5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>some_condition<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">next</span> <span class="token comment"># Skip to next j</span> <span class="token punctuation">}</span> <span class="token comment"># Normal processing</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Part 10: Alternatives to Nested Loops
Using expand.grid for Combinations
|
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"># Instead of nested loops for all combinations</span> rows <span class="token operator"><-</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">3</span> cols <span class="token operator"><-</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">4</span> <span class="token comment"># Nested loop approach</span> result1 <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> length<span class="token punctuation">(</span>rows<span class="token punctuation">)</span><span class="token punctuation">,</span> length<span class="token punctuation">(</span>cols<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>rows<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> seq_along<span class="token punctuation">(</span>cols<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> result1<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator"><-</span> rows<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> cols<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># Using expand.grid (often clearer)</span> combinations <span class="token operator"><-</span> expand.grid<span class="token punctuation">(</span>i <span class="token operator">=</span> rows<span class="token punctuation">,</span> j <span class="token operator">=</span> cols<span class="token punctuation">)</span> combinations<span class="token operator">$</span>product <span class="token operator"><-</span> combinations<span class="token operator">$</span>i <span class="token operator">*</span> combinations<span class="token operator">$</span>j result2 <span class="token operator"><-</span> matrix<span class="token punctuation">(</span>combinations<span class="token operator">$</span>product<span class="token punctuation">,</span> nrow <span class="token operator">=</span> length<span class="token punctuation">(</span>rows<span class="token punctuation">)</span><span class="token punctuation">,</span> byrow <span class="token operator">=</span> <span class="token boolean">TRUE</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Results match:"</span><span class="token punctuation">,</span> all<span class="token punctuation">(</span>result1 <span class="token operator">==</span> result2<span class="token punctuation">)</span><span class="token punctuation">)</span> |
Using apply Functions
|
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"># Instead of nested loops for matrix operations</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">12</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token comment"># Nested loop approach</span> row_sums1 <span class="token operator"><-</span> numeric<span class="token punctuation">(</span>nrow<span class="token punctuation">(</span>matrix_data<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>nrow<span class="token punctuation">(</span>matrix_data<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 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">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> total <span class="token operator"><-</span> total <span class="token operator">+</span> matrix_data<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token punctuation">}</span> row_sums1<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><-</span> total <span class="token punctuation">}</span> <span class="token comment"># Using apply (vectorized, often faster)</span> row_sums2 <span class="token operator"><-</span> apply<span class="token punctuation">(</span>matrix_data<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> sum<span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Row sums:"</span><span class="token punctuation">,</span> row_sums1<span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Using apply:"</span><span class="token punctuation">,</span> row_sums2<span class="token punctuation">)</span> |
Using outer for Pairwise Operations
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<span class="token comment"># Instead of nested loops for pairwise operations</span> x <span class="token operator"><-</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">5</span> y <span class="token operator"><-</span> <span class="token number">1</span><span class="token operator">:</span><span class="token number">4</span> <span class="token comment"># Nested loop approach</span> result1 <span class="token operator"><-</span> matrix<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> length<span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">,</span> length<span class="token punctuation">(</span>y<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>x<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> seq_along<span class="token punctuation">(</span>y<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> result1<span class="token punctuation">[</span>i<span class="token punctuation">,</span> j<span class="token punctuation">]</span> <span class="token operator"><-</span> x<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> y<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment"># Using outer (much faster for large data)</span> result2 <span class="token operator"><-</span> outer<span class="token punctuation">(</span>x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> <span class="token string">"*"</span><span class="token punctuation">)</span> print<span class="token punctuation">(</span><span class="token string">"Results match:"</span><span class="token punctuation">,</span> all<span class="token punctuation">(</span>result1 <span class="token operator">==</span> result2<span class="token punctuation">)</span><span class="token punctuation">)</span> |
Summary: The Nested Loop Philosophy
Nested loops are your tool for multi-dimensional iteration. Master these patterns:
-
2D structures – Matrices, data frames
-
3D structures – Arrays, time-series data
-
Pattern generation – Visual patterns, tables
-
Complex algorithms – Simulations, games
-
Data analysis – Cross-tabulation, pairwise comparisons
Key principles:
-
Outer loop typically represents the “slower-changing” dimension
-
Inner loop runs completely for each outer iteration
-
Total iterations = product of all loop sizes
-
Watch out for performance with deep nesting
-
Consider vectorized alternatives when possible
Best practices:
-
Use meaningful variable names (i, j, k for indices; row, col for clarity)
-
Pre-allocate result structures
-
Move invariant calculations outside inner loops
-
Put the loop with more iterations on the inside when possible
-
Add comments explaining the nesting logic
-
Consider alternatives (apply, outer, expand.grid) for simpler cases
When to use nested loops:
-
Working with multi-dimensional data structures
-
Algorithms that require examining neighbors
-
Creating patterns or tables
-
When each combination needs custom logic
-
Learning and teaching programming concepts
When NOT to use nested loops:
-
Simple operations on matrices (use vectorization)
-
When apply functions can do the job more cleanly
-
Performance-critical code with large dimensions
-
When the nesting depth makes code unreadable
Nested loops are like the gears in a complex machine – each level drives the next, creating intricate patterns of execution. Master them, and you’ll be able to tackle problems of any dimensionality!
Would you like me to elaborate on any specific aspect of nested loops or explore more complex real-world examples?
