Practicum Syntax & Control Flow
PRAKTIKUM ~ Week 04 ~
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 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.
ifelse() untuk operasi vectorized yang lebih efisien pada dataframe.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.
lapply() atau sapply() sering lebih cepat dari for loop untuk operasi pada list/vector.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.
break digunakan untuk menghentikan eksekusi loop seketika dan langsung keluar dari loop. Berguna saat menemukan kondisi tertentu dan tidak perlu melanjutkan iterasi berikutnya.
break hanya menghentikan loop terdalam. Jika ada nested loop, loop luar tetap berjalan.
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.
next sering dipakai untuk skip nilai NA atau data tidak valid dalam loop.
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.
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
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
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
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.
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
Gunakan perulangan while untuk menelusuri data karyawan baris per baris
selama belum ditemukan posisi "Manager". Begitu Manager ditemukan, loop langsung
berhenti dengan perintah break.
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
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.
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)
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.
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.