Practicum Syntax & Control Flow

PRAKTIKUM ~ Week 04 ~

Nakeisha Aulia Zahra
Student Major in Data Science
Lecturer: Bakti Siregar M.Sc., CDS
R Programming Data Science Statistics

1 Introduction

Deskripsi


Praktikum ini bertujuan untuk melatih penerapan logika Control Flow dalam bahasa pemrograman Python dan R. Fokus utama materi ini adalah kemampuan program dalam mengambil keputusan secara otomatis serta melakukan tugas yang berulang pada data. Pada sesi ini dikembangkan dua kompetensi utama:

  • Menguasai pernyataan kondisional (if, if-else, if-else if-else)
  • Menerapkan berbagai struktur perulangan (for, while, break, next)
🔀
if / else Multi-level logic branching untuk pengambilan keputusan

if/else digunakan untuk menjalankan blok kode berbeda berdasarkan kondisi yang dievaluasi. Jika kondisi bernilai TRUE, blok if dijalankan; jika FALSE, blok else yang dijalankan. Dapat digabung dengan else if untuk percabangan bertingkat.

# Contoh if / else di R nilai <- 75 if (nilai >= 80) { print("Nilai A - Sangat Baik") } else if (nilai >= 60) { print("Nilai B - Baik") } else { print("Nilai C - Perlu Perbaikan") } # Output: "Nilai B - Baik"
💡 Tips: Gunakan ifelse() untuk operasi vectorized yang lebih efisien pada dataframe.
🔄
for loop Iterasi atas koleksi data dengan jumlah yang diketahui

for loop digunakan saat ingin mengulang suatu proses untuk setiap elemen dalam vector, list, atau urutan angka. Sangat berguna ketika jumlah iterasi sudah diketahui sebelumnya.

# Iterasi angka 1 sampai 5 for (i in 1:5) { cat("Iterasi ke-", i, "\n") } # Iterasi atas vector buah buah <- c("apel", "mangga", "jeruk") for (item in buah) { print(item) }
💡 Tips: Di R, lapply() atau sapply() sering lebih cepat dari for loop untuk operasi pada list/vector.
while loop Iterasi sampai kondisi dinamis terpenuhi

while loop menjalankan blok kode secara berulang selama kondisi bernilai TRUE. Berbeda dengan for loop, while loop cocok saat jumlah iterasi tidak diketahui sebelumnya — loop berhenti otomatis saat kondisi menjadi FALSE.

# Hitung mundur dari 5 hitung <- 5 while (hitung > 0) { cat("Hitung:", hitung, "\n") hitung <- hitung - 1 } print("Selesai!") # Hati-hati: pastikan kondisi bisa jadi FALSE!
⚠️ Perhatian: Pastikan ada perubahan variabel di dalam loop agar tidak terjadi infinite loop.
🛑
break Hentikan dan keluar dari loop sepenuhnya

break digunakan untuk menghentikan eksekusi loop seketika dan langsung keluar dari loop. Berguna saat menemukan kondisi tertentu dan tidak perlu melanjutkan iterasi berikutnya.

# Cari angka pertama yang habis dibagi 7 for (i in 1:100) { if (i %% 7 == 0) { cat("Ditemukan:", i, "\n") break } } # Output: Ditemukan: 7
💡 Tips: break hanya menghentikan loop terdalam. Jika ada nested loop, loop luar tetap berjalan.
⏭️
next Lewati iterasi saat ini, loop tetap berlanjut

next (setara continue di bahasa lain) digunakan untuk melewati sisa kode dalam iterasi saat ini dan langsung lanjut ke iterasi berikutnya. Loop tidak berhenti, hanya iterasi tersebut yang dilewati.

# Cetak hanya angka ganjil for (i in 1:10) { if (i %% 2 == 0) { next } cat(i, " ") } # Output: 1 3 5 7 9
💡 Tips: next sering dipakai untuk skip nilai NA atau data tidak valid dalam loop.
🔁
repeat Loop tanpa batas — harus diakhiri dengan break

repeat adalah loop yang berjalan selamanya tanpa kondisi awal. Satu-satunya cara menghentikannya adalah dengan perintah break di dalam loop. Berguna untuk simulasi atau proses yang perlu dicek kondisinya di akhir iterasi.

# Contoh repeat dengan break x <- 1 repeat { cat("x =", x, "\n") x <- x + 1 if (x > 3) { print("Selesai!") break } }
⚠️ Perhatian: Selalu pastikan ada break di dalam repeat, atau program akan hang (infinite loop).

1.1 Dataset

Data Dummy


Dataset yang digunakan dalam seluruh latihan praktikum ini merupakan data fiktif yang mencakup profil lima karyawan. Setiap entri data memuat informasi mendetail mengenai identitas (ID dan Nama), karakteristik demografis (Usia), serta aspek profesional seperti Gaji, Jabatan, dan nilai Performa.

# ============================================================
# PRACTICUM - Dataset 
# ============================================================

employees <- data.frame(
  id          = c(1, 2, 3, 4, 5),
  name        = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
  age         = c(25, 30, 27, 35, 40),
  salary      = c(5000, 7000, 6500, 10000, 12000),
  position    = c("Staff", "Supervisor", "Staff", "Manager", "Director"),
  performance = c("Good", "Very Good", "Average", "Good", "Very Good"),
  stringsAsFactors = FALSE
)

1.1.1 Tabel Data

📋 Tabel Data Karyawan

ID
Nama
Usia
Gaji
Posisi
Performa
1
Bagas
25
5.000
Staf
Bagus
2
Joan
30
7.000
Pengawas
Sangat Bagus
3
Alya
27
6.500
Staf
Rata-rata
4
Dwi
35
10.000
Manajer
Bagus
5
Nabil
40
12.000
Direktur
Sangat Bagus

Interpretation


Dataset ini mencakup 5 karyawan (berusia 25–40 tahun) dengan hierarki jabatan yang jelas, dipimpin oleh Nabil (Direktur, 12.000) dan posisi awal oleh Bagas (Staf, 5.000), dengan rata-rata gaji sebesar 8.100.

Kolom Performa yang diberi kode warna memberikan identifikasi cepat bagi manajemen: biru untuk Sangat Bagus, hijau untuk Bagus, dan abu-abu untuk Rata-rata.

2 Pernyataan Persyaratan

Pernyataan Bersyarat


Tentukan tingkat bonus berdasarkan kinerja karyawan:

  • Sangat Baik → 20% dari gaji
  • Baik → 10% dari gaji
  • Rata-rata → 5% dari gaji

Tugas Anda:

  • Tulis program dalam Python dan R untuk menghitung bonus setiap karyawan.
  • Tampilkan output dalam format ini:
    "Name: Bagas, Bonus: 500"

2.1 Menentukan Bonus Karyawan

Penentuan Bonus Berdasarkan Performa Karyawan


Penentuan bonus karyawan dilakukan berdasarkan performa masing-masing dengan menggunakan struktur if-else if-else dalam bahasa pemrograman R. Metode ini bekerja melalui penerapan beberapa kondisi logis di mana nilai bonus diperoleh dari hasil perkalian antara persentase bonus yang ditetapkan dengan besaran gaji karyawan.

# ============================================================
# PRACTICUM - Menentukan Bonus Karyawan
# ============================================================

for (i in 1:nrow(employees)) {
  perf <- employees$performance[i]
  sal  <- employees$salary[i]
  name <- employees$name[i]

  if (perf == "Very Good") {
    bonus <- sal * 0.20
  } else if (perf == "Good") {
    bonus <- sal * 0.10
  } else {
    bonus <- sal * 0.05
  }

  cat(sprintf("Name: %s, Bonus: %.0f\n", name, bonus))
}
## Name: Bagas, Bonus: 500
## Name: Joan, Bonus: 1400
## Name: Alya, Bonus: 325
## Name: Dwi, Bonus: 1000
## Name: Nabil, Bonus: 2400

2.2 Visualisasi Bonus

# ============================================================
# Menghitung bonus dan menyimpannya ke data frame
# ============================================================

employees$bonus <- 0

for (i in 1:nrow(employees)) {
  performance <- employees$performance[i]
  salary      <- employees$salary[i]

  if (performance == "Very Good") {
    employees$bonus[i] <- salary * 0.20
  } else if (performance == "Good") {
    employees$bonus[i] <- salary * 0.10
  } else if (performance == "Average") {
    employees$bonus[i] <- salary * 0.05
  } else {
    employees$bonus[i] <- 0
  }
}

2.2.1 Tabel Hasil Bonus

💰 Tabel Data Karyawan dan Perhitungan Bonus

ID
Nama
Usia
Gaji
Posisi
Performa
Bonus
1
Bagas
25
5.000
Staf
Bagus
500
2
Joan
30
7.000
Pengawas
Sangat Bagus
1.400
3
Alya
27
6.500
Staf
Rata-rata
325
4
Dwi
35
10.000
Manajer
Bagus
1.000
5
Nabil
40
12.000
Direktur
Sangat Bagus
2.400

2.2.2 Bar Chart Bonus

library(plotly)

perf_colors <- c(
  "Very Good" = "#2d82b7",
  "Good"      = "#38b2ac",
  "Average"   = "#718096"
)

emp_vg  <- employees[employees$performance == "Very Good", ]
emp_gd  <- employees[employees$performance == "Good", ]
emp_avg <- employees[employees$performance == "Average", ]

make_hover <- function(df) {
  paste0(
    "<b style='font-size:14px'>", df$name, "</b><br>",
    "<span style='color:#90cdf4'>Posisi   :</span> ", df$position, "<br>",
    "<span style='color:#90cdf4'>Performa :</span> ", df$performance, "<br>",
    "<span style='color:#90cdf4'>Gaji     :</span> ", format(df$salary, big.mark = "."), "<br>",
    "<span style='color:#68d391'><b>Bonus    : ", format(df$bonus, big.mark = "."), "</b></span>"
  )
}

plot_ly() %>%
  add_bars(data = emp_avg, x = ~name, y = ~bonus, name = "Average",
           marker    = list(color = "#718096", line = list(color = "rgba(255,255,255,0.6)", width = 1.5)),
           hovertext = make_hover(emp_avg), hoverinfo = "text") %>%
  add_bars(data = emp_gd, x = ~name, y = ~bonus, name = "Good",
           marker    = list(color = "#38b2ac", line = list(color = "rgba(255,255,255,0.6)", width = 1.5)),
           hovertext = make_hover(emp_gd), hoverinfo = "text") %>%
  add_bars(data = emp_vg, x = ~name, y = ~bonus, name = "Very Good",
           marker    = list(color = "#2d82b7", line = list(color = "rgba(255,255,255,0.6)", width = 1.5)),
           hovertext = make_hover(emp_vg), hoverinfo = "text") %>%
  layout(
    title  = list(text = "<b>Bonus Karyawan Berdasarkan Performa</b>",
                  font = list(family = "Inter, sans-serif", size = 18, color = "#1a3a5c"),
                  x = 0.04, y = 0.97),
    xaxis  = list(title     = list(text = "<b>Nama Karyawan</b>",
                                   font = list(family = "Inter, sans-serif", size = 13, color = "#2d4a6a")),
                  tickfont  = list(family = "Inter, sans-serif", size = 12, color = "#1e3a5f"),
                  showgrid  = FALSE, zeroline = FALSE, showline = TRUE, linecolor = "#c8dff0",
                  categoryorder = "array",
                  categoryarray = c("Alya", "Bagas", "Dwi", "Joan", "Nabil")),
    yaxis  = list(title     = list(text = "<b>Jumlah Bonus</b>",
                                   font = list(family = "Inter, sans-serif", size = 13, color = "#2d4a6a")),
                  tickfont  = list(family = "Inter, sans-serif", size = 12, color = "#1e3a5f"),
                  gridcolor = "#e2eef7", gridwidth = 1, zeroline = FALSE, rangemode = "tozero"),
    legend = list(title       = list(text = "<b>Performa</b>",
                                     font = list(family = "Inter, sans-serif", size = 12, color = "#1a3a5c")),
                  font        = list(family = "Inter, sans-serif", size = 12, color = "#2d4a6a"),
                  bgcolor     = "rgba(247,251,255,0.92)", bordercolor = "#c8dff0", borderwidth = 1,
                  orientation = "v", x = 0.78, y = 0.97),
    barmode       = "group", bargap = 0.3, hovermode = "closest",
    plot_bgcolor  = "#f7fbff", paper_bgcolor = "rgba(238,246,255,0.55)",
    margin        = list(t = 70, b = 60, l = 65, r = 20),
    hoverlabel    = list(bgcolor = "#0d1b2a",
                         font    = list(family = "JetBrains Mono, monospace", size = 12, color = "#d0e8ff"),
                         bordercolor = "#2d82b7", align = "left")
  ) %>%
  config(displayModeBar = FALSE)

Interpretation


Grafik interaktif ini menunjukkan distribusi bonus yang diterima oleh lima karyawan, di mana Nabil menerima bonus tertinggi sebesar 2.400 (20% dari gaji 12.000 — Very Good) dan Alya menerima bonus terendah sebesar 325 (5% dari gaji 6.500 — Average).

Kode warna konsisten: biru Very Good, teal Good, abu-abu Average. Hover pada setiap bar untuk melihat detail lengkap karyawan.

3 Perulangan (FOR & WHILE)

Penjelasan Mengenai Perulangan (Loops)


Gunakan teknik perulangan berikut untuk memproses dan menganalisis data karyawan:

  • for loop — Memeriksa seluruh data karyawan satu per satu, misalnya saat menyaring data berdasarkan rentang gaji tertentu.
  • while loop — Menjalankan proses secara berulang selama suatu kondisi spesifik masih terpenuhi.
  • break — Menghentikan seluruh proses perulangan seketika saat kondisi tertentu tercapai.
  • next (Continue) — Melompati data yang sedang diproses dan langsung lanjut ke data berikutnya.

3.1 For Loop

📝
Tugas For Loop Tampilkan karyawan dengan gaji lebih besar dari 6.000

Gunakan perulangan for untuk memeriksa setiap baris data karyawan satu per satu. Pada setiap iterasi, diterapkan kondisi if untuk menyaring karyawan yang memiliki gaji lebih dari 6.000 dan menampilkan hasilnya.

💡 Konsep: for loop memungkinkan iterasi atas seluruh baris data secara sistematis — sangat cocok untuk filtering dan inspeksi data.
for (i in 1:nrow(employees)) {
  # Conditional: cek apakah gaji lebih dari 6000
  if (employees$salary[i] > 6000) {
    cat(paste0("Name: ", employees$name[i],
               ", Salary: ", employees$salary[i], "\n"))
  }
}
## Name: Joan, Salary: 7000
## Name: Alya, Salary: 6500
## Name: Dwi, Salary: 10000
## Name: Nabil, Salary: 12000

3.1.1 Visualisasi For Loop

library(plotly)

employees$filter_status <- ifelse(employees$salary > 6000, "Gaji > 6.000 ✓", "Gaji ≤ 6.000 ✗")

colors_for <- c("Gaji > 6.000 ✓" = "#2d82b7", "Gaji ≤ 6.000 ✗" = "#cbd5e0")

hover_for <- paste0(
  "<b>", employees$name, "</b><br>",
  "<span style='color:#90cdf4'>Posisi :</span> ", employees$position, "<br>",
  "<span style='color:#90cdf4'>Gaji   :</span> ", format(employees$salary, big.mark = "."), "<br>",
  "<span style='color:", ifelse(employees$salary > 6000, "#68d391", "#fc8181"), "'>",
  "<b>", employees$filter_status, "</b></span>"
)

plot_ly(
  data      = employees,
  x         = ~reorder(name, -salary),
  y         = ~salary,
  type      = "bar",
  color     = ~filter_status,
  colors    = colors_for,
  hovertext = hover_for,
  hoverinfo = "text",
  marker    = list(line = list(color = "rgba(255,255,255,0.7)", width = 1.5))
) %>%
  add_segments(
    x = -0.5, xend = 4.5, y = 6000, yend = 6000,
    line = list(color = "#e53e3e", width = 2, dash = "dash"),
    name = "Batas Gaji 6.000", inherit = FALSE
  ) %>%
  add_annotations(
    x = 4.4, y = 6000,
    text = "<b>Batas 6.000</b>",
    showarrow = FALSE,
    font = list(color = "#e53e3e", size = 11, family = "Inter, sans-serif"),
    xanchor = "right", yanchor = "bottom"
  ) %>%
  layout(
    title      = list(text = "<b>Distribusi Gaji Karyawan — Filter For Loop (Gaji > 6.000)</b>",
                      font = list(family = "Inter, sans-serif", size = 17, color = "#1a3a5c"),
                      x = 0.03, y = 0.97),
    xaxis      = list(title    = list(text = "<b>Nama Karyawan</b>",
                                      font = list(family = "Inter, sans-serif", size = 13, color = "#2d4a6a")),
                      tickfont = list(family = "Inter, sans-serif", size = 12, color = "#1e3a5f"),
                      showgrid = FALSE, zeroline = FALSE),
    yaxis      = list(title    = list(text = "<b>Gaji</b>",
                                      font = list(family = "Inter, sans-serif", size = 13, color = "#2d4a6a")),
                      tickfont = list(family = "Inter, sans-serif", size = 12, color = "#1e3a5f"),
                      gridcolor = "#e2eef7", rangemode = "tozero"),
    legend     = list(font = list(family = "Inter, sans-serif", size = 12, color = "#2d4a6a"),
                      bgcolor = "rgba(247,251,255,0.9)", bordercolor = "#c8dff0", borderwidth = 1,
                      x = 0.72, y = 0.97),
    barmode    = "overlay", bargap = 0.35,
    plot_bgcolor  = "#f7fbff", paper_bgcolor = "rgba(238,246,255,0.55)",
    margin        = list(t = 70, b = 60, l = 65, r = 20),
    hovermode     = "closest",
    hoverlabel    = list(bgcolor = "#0d1b2a",
                         font    = list(family = "JetBrains Mono, monospace", size = 12, color = "#d0e8ff"),
                         bordercolor = "#2d82b7", align = "left")
  ) %>%
  config(displayModeBar = FALSE)

Interpretation — For Loop


Grafik di atas memvisualisasikan hasil filtering menggunakan for loop. Garis merah putus-putus menandai ambang batas gaji 6.000. Bar berwarna biru menunjukkan karyawan yang lolos filter (gaji > 6.000), yaitu: Joan (7.000), Alya (6.500), Dwi (10.000), dan Nabil (12.000).

Hanya Bagas yang ditampilkan dengan warna abu-abu karena gajinya (5.000) berada di bawah batas. For loop berhasil menyaring 4 dari 5 karyawan yang memenuhi syarat.


3.2 While Loop

🔁
While Loop Iterasi hingga ditemukan karyawan dengan posisi "Manager"

Gunakan perulangan while untuk menelusuri data karyawan baris per baris selama belum ditemukan posisi "Manager". Begitu Manager ditemukan, loop langsung berhenti dengan perintah break.

💡 Konsep: while loop cocok ketika jumlah iterasi tidak diketahui — proses berjalan sampai kondisi tertentu terpenuhi.
i <- 1  # Mulai dari baris pertama

while (i <= nrow(employees)) {
  name     <- employees$name[i]
  position <- employees$position[i]

  if (position == "Manager") {
    # Jika Manager ditemukan, tampilkan dan hentikan loop
    cat(paste0("Name: ", name, ", Position: ", position, " (Stop here)\n"))
    break
  } else {
    cat(paste0("Name: ", name, ", Position: ", position, "\n"))
  }

  i <- i + 1  # Lanjut ke baris berikutnya
}
## Name: Bagas, Position: Staff
## Name: Joan, Position: Supervisor
## Name: Alya, Position: Staff
## Name: Dwi, Position: Manager (Stop here)

3.2.1 Visualisasi While Loop

manager_idx <- which(employees$position == "Manager")[1]

employees$while_status <- "Tidak Diproses"
employees$while_status[1:manager_idx] <- "Diproses"
employees$while_status[manager_idx]   <- "STOP — Manager"

status_colors <- c(
  "Diproses"       = "#38b2ac",
  "STOP — Manager" = "#e53e3e",
  "Tidak Diproses" = "#cbd5e0"
)

hover_while <- paste0(
  "<b>", employees$name, "</b><br>",
  "<span style='color:#90cdf4'>Posisi  :</span> ", employees$position, "<br>",
  "<span style='color:#90cdf4'>Urutan  :</span> ", employees$id, "<br>",
  "<span style='color:", ifelse(employees$while_status == "STOP — Manager", "#fc8181",
                         ifelse(employees$while_status == "Diproses", "#68d391", "#a0aec0")), "'>",
  "<b>Status  : ", employees$while_status, "</b></span>"
)

plot_ly(
  data      = employees,
  x         = ~id,
  y         = ~salary,
  type      = "scatter",
  mode      = "markers+lines",
  color     = ~while_status,
  colors    = status_colors,
  marker    = list(size = 18, line = list(color = "white", width = 2)),
  line      = list(color = "#c8dff0", width = 1.5, dash = "dot"),
  hovertext = hover_while,
  hoverinfo = "text"
) %>%
  add_annotations(
    data      = employees,
    x         = ~id,
    y         = ~salary,
    text      = ~name,
    showarrow = FALSE,
    yshift    = 18,
    font      = list(family = "Inter, sans-serif", size = 11, color = "#1a3a5c"),
    inherit   = TRUE
  ) %>%
  add_annotations(
    x         = manager_idx,
    y         = employees$salary[manager_idx],
    text      = "⛔ Loop Berhenti",
    showarrow = TRUE,
    arrowhead = 2,
    arrowcolor = "#e53e3e",
    ax        = 40,
    ay        = -40,
    font      = list(family = "Inter, sans-serif", size = 11, color = "#e53e3e", weight = 700)
  ) %>%
  layout(
    title  = list(text = "<b>Alur While Loop — Berhenti Saat Manager Ditemukan</b>",
                  font = list(family = "Inter, sans-serif", size = 17, color = "#1a3a5c"),
                  x = 0.03, y = 0.97),
    xaxis  = list(title    = list(text = "<b>Urutan Iterasi (ID Karyawan)</b>",
                                  font = list(family = "Inter, sans-serif", size = 13, color = "#2d4a6a")),
                  tickfont = list(family = "Inter, sans-serif", size = 12, color = "#1e3a5f"),
                  dtick    = 1, showgrid = FALSE),
    yaxis  = list(title    = list(text = "<b>Gaji Karyawan</b>",
                                  font = list(family = "Inter, sans-serif", size = 13, color = "#2d4a6a")),
                  tickfont = list(family = "Inter, sans-serif", size = 12, color = "#1e3a5f"),
                  gridcolor = "#e2eef7", rangemode = "tozero"),
    legend = list(font     = list(family = "Inter, sans-serif", size = 12, color = "#2d4a6a"),
                  bgcolor  = "rgba(247,251,255,0.9)", bordercolor = "#c8dff0", borderwidth = 1,
                  x = 0.03, y = 0.15),
    plot_bgcolor  = "#f7fbff", paper_bgcolor = "rgba(238,246,255,0.55)",
    margin        = list(t = 70, b = 60, l = 65, r = 20),
    hovermode     = "closest",
    hoverlabel    = list(bgcolor = "#0d1b2a",
                         font    = list(family = "JetBrains Mono, monospace", size = 12, color = "#d0e8ff"),
                         bordercolor = "#2d82b7", align = "left")
  ) %>%
  config(displayModeBar = FALSE)

Interpretation — While Loop


Grafik scatter ini mengilustrasikan perjalanan while loop saat menelusuri data karyawan. Titik berwarna teal menunjukkan karyawan yang sudah diproses (Bagas, Joan, Alya), sedangkan titik merah menandai titik berhenti pada Dwi (Manager).

Nabil ditampilkan dengan warna abu-abu karena loop sudah berhenti sebelum mencapainya — inilah esensi while loop: efisien karena tidak memproses data yang tidak perlu. Loop berhasil berhenti pada iterasi ke-4 dari total 5 karyawan.


3.3 Break

Break Hentikan loop saat gaji karyawan melampaui 10.000

Gunakan perintah break untuk menghentikan perulangan secara paksa ketika ditemukan karyawan dengan gaji di atas 10.000. Semua karyawan sebelumnya ditampilkan, dan iterasi langsung berhenti saat kondisi break terpenuhi.

💡 Konsep: break sangat berguna untuk early exit — menghentikan proses begitu target sudah ditemukan tanpa perlu melanjutkan sisa iterasi.
for (i in 1:nrow(employees)) {
  name   <- employees$name[i]
  salary <- employees$salary[i]

  if (salary > 10000) {
    # Jika gaji > 10000, tampilkan pesan dan hentikan loop
    cat(paste0("(Stopped because ", name, " has a salary above 10,000)\n"))
    break
  }

  # Tampilkan karyawan yang gajinya <= 10000
  cat(paste0("Name: ", name, ", Salary: ", salary, "\n"))
}
## Name: Bagas, Salary: 5000
## Name: Joan, Salary: 7000
## Name: Alya, Salary: 6500
## Name: Dwi, Salary: 10000
## (Stopped because Nabil has a salary above 10,000)

3.3.1 Visualisasi Break

break_idx <- which(employees$salary > 10000)[1]

employees$break_status <- ifelse(
  employees$id < break_idx, "Diproses (Ditampilkan)",
  ifelse(employees$id == break_idx, "BREAK — Gaji > 10.000", "Tidak Diproses")
)

break_colors <- c(
  "Diproses (Ditampilkan)" = "#2d82b7",
  "BREAK — Gaji > 10.000" = "#e53e3e",
  "Tidak Diproses"         = "#cbd5e0"
)

hover_break <- paste0(
  "<b>", employees$name, "</b><br>",
  "<span style='color:#90cdf4'>Posisi  :</span> ", employees$position, "<br>",
  "<span style='color:#90cdf4'>Gaji    :</span> ", format(employees$salary, big.mark = "."), "<br>",
  "<span style='color:", ifelse(employees$break_status == "BREAK — Gaji > 10.000", "#fc8181",
                         ifelse(employees$break_status == "Diproses (Ditampilkan)", "#68d391", "#a0aec0")), "'>",
  "<b>Status  : ", employees$break_status, "</b></span>"
)

plot_ly(
  data      = employees,
  x         = ~reorder(name, id),
  y         = ~salary,
  type      = "bar",
  color     = ~break_status,
  colors    = break_colors,
  hovertext = hover_break,
  hoverinfo = "text",
  marker    = list(line = list(color = "rgba(255,255,255,0.7)", width = 1.5))
) %>%
  add_segments(
    x = -0.5, xend = 4.5, y = 10000, yend = 10000,
    line = list(color = "#e53e3e", width = 2.5, dash = "dash"),
    name = "Batas Break 10.000", inherit = FALSE
  ) %>%
  add_annotations(
    x = 4.4, y = 10000,
    text = "<b>Batas Break: 10.000</b>",
    showarrow = FALSE,
    font = list(color = "#e53e3e", size = 11, family = "Inter, sans-serif"),
    xanchor = "right", yanchor = "bottom"
  ) %>%
  layout(
    title  = list(text = "<b>Visualisasi Break — Loop Berhenti Saat Gaji > 10.000</b>",
                  font = list(family = "Inter, sans-serif", size = 17, color = "#1a3a5c"),
                  x = 0.03, y = 0.97),
    xaxis  = list(title    = list(text = "<b>Nama Karyawan (Urutan Iterasi)</b>",
                                  font = list(family = "Inter, sans-serif", size = 13, color = "#2d4a6a")),
                  tickfont = list(family = "Inter, sans-serif", size = 12, color = "#1e3a5f"),
                  showgrid = FALSE, zeroline = FALSE,
                  categoryorder = "array",
                  categoryarray = employees$name[order(employees$id)]),
    yaxis  = list(title    = list(text = "<b>Gaji Karyawan</b>",
                                  font = list(family = "Inter, sans-serif", size = 13, color = "#2d4a6a")),
                  tickfont = list(family = "Inter, sans-serif", size = 12, color = "#1e3a5f"),
                  gridcolor = "#e2eef7", rangemode = "tozero"),
    legend = list(font     = list(family = "Inter, sans-serif", size = 12, color = "#2d4a6a"),
                  bgcolor  = "rgba(247,251,255,0.9)", bordercolor = "#c8dff0", borderwidth = 1,
                  x = 0.55, y = 0.97),
    barmode = "group", bargap = 0.35,
    plot_bgcolor  = "#f7fbff", paper_bgcolor = "rgba(238,246,255,0.55)",
    margin        = list(t = 70, b = 60, l = 65, r = 20),
    hovermode     = "closest",
    hoverlabel    = list(bgcolor = "#0d1b2a",
                         font    = list(family = "JetBrains Mono, monospace", size = 12, color = "#d0e8ff"),
                         bordercolor = "#2d82b7", align = "left")
  ) %>%
  config(displayModeBar = FALSE)

Interpretation — Break


Grafik bar ini memperlihatkan perilaku perintah break saat dijalankan. Garis merah putus-putus menunjukkan ambang batas gaji 10.000. Bar berwarna biru adalah karyawan yang berhasil ditampilkan sebelum loop berhenti: Bagas, Joan, Alya, dan Dwi.

Bar berwarna merah menandai Nabil (12.000) sebagai titik pemicu break — gajinya melampaui batas 10.000. Loop dihentikan di sini sehingga tidak ada karyawan lain setelahnya yang diproses. Ini mendemonstrasikan early exit yang efisien.


3.4 Next (Continue)

⏭️
Next (Continue) Lewati karyawan dengan performa "Average", tampilkan sisanya

Gunakan perintah next untuk melewati karyawan yang memiliki performa "Average" dan langsung lanjut ke karyawan berikutnya. Loop tetap berjalan hingga akhir — hanya iterasi dengan performa Average yang dilewati.

💡 Konsep: next berbeda dengan break — loop tidak berhenti, melainkan hanya melewati iterasi tertentu. Setara dengan continue di Python/Java.
for (i in 1:nrow(employees)) {
  name        <- employees$name[i]
  performance <- employees$performance[i]

  # Jika performa "Average", maka gunakan next (setara continue Python) untuk skip
  if (performance == "Average") { 
    next  # Lanjut ke iterasi berikutnya
  }
  
  #  Tampilkan nama karyawan yang selain performanya "Average"
  cat(paste0("Name: ", name, ", Performance: ", performance, "\n")) 
}
## Name: Bagas, Performance: Good
## Name: Joan, Performance: Very Good
## Name: Dwi, Performance: Good
## Name: Nabil, Performance: Very Good

3.4.1 Visualisasi Next (Continue)

employees$next_status <- ifelse(
  employees$performance == "Average",
  "Dilewati (next)",
  "Ditampilkan"
)

next_colors <- c(
  "Ditampilkan"      = "#2d82b7",
  "Dilewati (next)"  = "#ed8936"
)

pos_order <- c("Staff", "Supervisor", "Manager", "Director")

hover_next <- paste0(
  "<b>", employees$name, "</b><br>",
  "<span style='color:#90cdf4'>Posisi   :</span> ", employees$position, "<br>",
  "<span style='color:#90cdf4'>Performa :</span> ", employees$performance, "<br>",
  "<span style='color:#90cdf4'>Gaji     :</span> ", format(employees$salary, big.mark = "."), "<br>",
  "<span style='color:", ifelse(employees$next_status == "Dilewati (next)", "#fbd38d", "#68d391"), "'>",
  "<b>Status   : ", employees$next_status, "</b></span>"
)

plot_ly(
  data      = employees,
  x         = ~name,
  y         = ~salary,
  type      = "bar",
  color     = ~next_status,
  colors    = next_colors,
  hovertext = hover_next,
  hoverinfo = "text",
  marker    = list(
    line    = list(color = "rgba(255,255,255,0.7)", width = 1.5),
    opacity = ifelse(employees$next_status == "Dilewati (next)", 0.5, 1)
  )
) %>%
  add_annotations(
    data      = employees[employees$next_status == "Dilewati (next)", ],
    x         = ~name,
    y         = ~salary,
    text      = "⏭ SKIP",
    showarrow = FALSE,
    yshift    = 14,
    font      = list(family = "Inter, sans-serif", size = 11, color = "#c05621", weight = 700),
    inherit   = TRUE
  ) %>%
  layout(
    title  = list(text = "<b>Visualisasi Next — Karyawan dengan Performa Average Dilewati</b>",
                  font = list(family = "Inter, sans-serif", size = 17, color = "#1a3a5c"),
                  x = 0.03, y = 0.97),
    xaxis  = list(title    = list(text = "<b>Nama Karyawan</b>",
                                  font = list(family = "Inter, sans-serif", size = 13, color = "#2d4a6a")),
                  tickfont = list(family = "Inter, sans-serif", size = 12, color = "#1e3a5f"),
                  showgrid = FALSE, zeroline = FALSE,
                  categoryorder = "array",
                  categoryarray = employees$name[order(employees$id)]),
    yaxis  = list(title    = list(text = "<b>Gaji Karyawan</b>",
                                  font = list(family = "Inter, sans-serif", size = 13, color = "#2d4a6a")),
                  tickfont = list(family = "Inter, sans-serif", size = 12, color = "#1e3a5f"),
                  gridcolor = "#e2eef7", rangemode = "tozero"),
    legend = list(font     = list(family = "Inter, sans-serif", size = 12, color = "#2d4a6a"),
                  bgcolor  = "rgba(247,251,255,0.9)", bordercolor = "#c8dff0", borderwidth = 1,
                  x = 0.72, y = 0.97),
    bargap = 0.35,
    plot_bgcolor  = "#f7fbff", paper_bgcolor = "rgba(238,246,255,0.55)",
    margin        = list(t = 70, b = 60, l = 65, r = 20),
    hovermode     = "closest",
    hoverlabel    = list(bgcolor = "#0d1b2a",
                         font    = list(family = "JetBrains Mono, monospace", size = 12, color = "#d0e8ff"),
                         bordercolor = "#2d82b7", align = "left")
  ) %>%
  config(displayModeBar = FALSE)

Interpretation — Next (Continue)


Grafik bar ini menggambarkan cara kerja perintah next. Bar berwarna biru menunjukkan karyawan yang berhasil ditampilkan: Bagas, Joan, Dwi, dan Nabil. Sementara bar oranye dengan label "⏭ SKIP" menandai Alya yang dilewati karena performanya Average.

Perbedaan utama dengan break: loop tetap berjalan sampai akhir — Nabil tetap diproses meskipun Alya dilewati. Perintah next hanya melewati satu iterasi tanpa menghentikan keseluruhan loop, sehingga 4 dari 5 karyawan berhasil ditampilkan.