Second Task
Praticum Week 4
library(htmltools)
# 1. Definisi Style (CSS Modern & Aesthetic)
style <- "
@import url('[https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;800&display=swap](https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;800&display=swap)');
.canvas {
display: flex;
justify-content: center;
padding: 40px;
background: #0f172a; /* Dark background */
}
.profile-card {
display: flex;
align-items: center;
gap: 30px;
padding: 40px;
border-radius: 30px;
background: rgba(255, 255, 255, 0.05); /* Glass effect */
backdrop-filter: blur(15px);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 25px 50px rgba(0, 0, 0, 0.3);
max-width: 700px;
font-family: 'Poppins', sans-serif;
position: relative;
overflow: hidden;
}
/* Variasi hiasan cahaya di belakang */
.profile-card::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(233,30,99,0.1) 0%, transparent 70%);
z-index: -1;
}
.profile-card img {
width: 160px;
height: 160px;
object-fit: cover;
border-radius: 25px; /* Boxy-round modern */
transform: rotate(-3deg);
transition: 0.4s ease;
border: 2px solid rgba(255, 255, 255, 0.5);
}
.profile-card:hover img {
transform: rotate(0deg) scale(1.05);
}
.profile-text {
flex: 1;
}
.profile-text h3 {
font-size: 28px;
font-weight: 800;
margin: 0;
background: linear-gradient(to right, #ff80b5, #f472b6);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.profile-description {
font-size: 14px;
font-weight: 300;
color: #cbd5e1;
margin-top: 5px;
margin-bottom: 20px;
letter-spacing: 1px;
}
.mentor-label {
font-size: 11px;
text-transform: uppercase;
color: #94a3b8;
letter-spacing: 2px;
margin-bottom: 5px;
display: block;
}
.mentor-box {
background: rgba(244, 114, 182, 0.1);
padding: 12px 20px;
border-radius: 15px;
display: flex;
align-items: center;
gap: 10px;
border: 1px solid rgba(244, 114, 182, 0.2);
}
.mentor-name {
font-size: 15px;
font-weight: 600;
color: #fbcfe8;
}
.badge {
width: 8px;
height: 8px;
background: #f472b6;
border-radius: 50%;
box-shadow: 0 0 10px #f472b6;
}
"
# 2. Struktur Tampilan (HTML)
browsable(
tagList(
tags$style(style),
HTML('
<div class="canvas">
<div class="profile-card">
<img src="PSD (chricyesia)/WhatsApp Image 2026-03-13 at 23.43.40.jpeg">
<div class="profile-text">
<h3>Chricyesia Winnerlady Frexisovara Uvas</h3>
<div class="profile-description">
Data Science Student @ ITSB
</div>
<span class="mentor-label">Mentored By</span>
<div class="mentor-box">
<div class="badge"></div>
<span class="mentor-name">Mr. Bakti Siregar M.Sc., CDS</span>
</div>
</div>
</div>
</div>
')
)
)Chricyesia Winnerlady Frexisovara Uvas
Data Science Student @ ITSB
Mentored By
Mr. Bakti Siregar M.Sc., CDS
1 . Praticum
Independent Practice:Conditional Statements and Loops in Python & R
1.1 Objective
- Understand and implement Conditional Statements (if,if-else,if-elif-else).
- Apply loops (for loop,while loop,break,continue) to analyze a dataset.
Use the following dummy dataset:
library(knitr)
# 1. Membuat dataset dummy (Sesuai Tabel 2.5.1)
employee_data <- 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
)
# Menampilkan tabel utama dengan format yang bersih
kable(employee_data,
format = "simple",
caption = "Tabel 2.5.1 Dummy Dataset",
align = "cllllc")| ID | Name | Age | Salary | Position | Performance |
|---|---|---|---|---|---|
| 1 | Bagas | 25 | 5000 | Staff | Good |
| 2 | Joan | 30 | 7000 | Supervisor | Very Good |
| 3 | Alya | 27 | 6500 | Staff | Average |
| 4 | Dwi | 35 | 10000 | Manager | Good |
| 5 | Nabil | 40 | 12000 | Director | Very Good |
# Membuat dataframe sesuai dengan tabel pada gambar
df_karyawan <- 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
)
# Menampilkan isi dataframe untuk memastikan data sudah benar
print(df_karyawan) ID Name Age Salary Position Performance
1 1 Bagas 25 5000 Staff Good
2 2 Joan 30 7000 Supervisor Very Good
3 3 Alya 27 6500 Staff Average
4 4 Dwi 35 10000 Manager Good
5 5 Nabil 40 12000 Director Very Good
1.2 Conditional Statements
# Kita punya df_karyawan sebagai sumber data utama di sini. Di dalamnya sudah ada variabel nama, jabatan, dan gaji masing-masing orang, jadi kita tinggal mengolah untuk melihat gambaran besar tim kita.
# 1. Definisikan persentase bonus dalam named vector (seperti kamus/dictionary)
persen_bonus <- c("Very Good" = 0.20, "Good" = 0.10, "Average" = 0.05)
# 2. Iterasi dengan cara yang lebih 'clean'
for (i in 1:nrow(df_karyawan)) {
# Ambil data performa dan gaji
perf <- df_karyawan$Performance[i]
gaji <- df_karyawan$Salary[i]
nama <- df_karyawan$Name[i]
# Ambil nilai bonus berdasarkan key (performa), default ke 0 jika tidak ditemukan
bonus <- gaji * (persen_bonus[perf] %||% 0)
# Gunakan sprintf untuk format teks yang lebih rapi (mirip bahasa C atau Python)
cat(sprintf("\"Name: %s, Bonus: %g\"\n", nama, bonus))
}"Name: Bagas, Bonus: 500"
"Name: Joan, Bonus: 1400"
"Name: Alya, Bonus: 325"
"Name: Dwi, Bonus: 1000"
"Name: Nabil, Bonus: 2400"
1.3 Loops (For & While)
# Kita buat fungsi helper untuk mencetak garis pemisah agar output lebih rapi
print_header <- function(title) {
cat(sprintf("\n%s\n%s\n", paste(rep("=", 30), collapse = ""), title))
}
# --- No 1: Filter dengan For Loop (Standard) ---
print_header("EMPLOYEES WITH SALARY > 6000")
==============================
EMPLOYEES WITH SALARY > 6000
for (i in 1:nrow(df_karyawan)) {
with(df_karyawan[i, ], {
if (Salary > 6000) cat(sprintf("Name: %s, Salary: %g\n", Name, Salary))
})
}Name: Joan, Salary: 7000
Name: Alya, Salary: 6500
Name: Dwi, Salary: 10000
Name: Nabil, Salary: 12000
==============================
SEARCHING FOR MANAGER...
i <- 1
found_manager <- FALSE
while (i <= nrow(df_karyawan) && !found_manager) {
curr <- df_karyawan[i, ]
is_manager <- curr$Position == "Manager"
msg <- sprintf("Name: %s, Position: %s%s",
curr$Name, curr$Position,
if(is_manager) " (Stop here)" else "")
cat(msg, "\n")
if (is_manager) break
i <- i + 1
}Name: Bagas, Position: Staff
Name: Joan, Position: Supervisor
Name: Alya, Position: Staff
Name: Dwi, Position: Manager (Stop here)
==============================
SALARY CAP ANALYSIS (MAX 10,000)
for (i in 1:nrow(df_karyawan)) {
if (df_karyawan$Salary[i] > 10000) {
cat(sprintf("!!! (Stopped because %s has a salary above 10,000)\n", df_karyawan$Name[i]))
break
}
cat(sprintf("Name: %s, Salary: %g\n", df_karyawan$Name[i], df_karyawan$Salary[i]))
}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)
==============================
HIGH/GOOD PERFORMANCE ONLY
for (i in 1:nrow(df_karyawan)) {
if (df_karyawan$Performance[i] == "Average") next
cat(sprintf("Name: %-6s | Performance: %s\n",
df_karyawan$Name[i], df_karyawan$Performance[i]))
}Name: Bagas | Performance: Good
Name: Joan | Performance: Very Good
Name: Dwi | Performance: Good
Name: Nabil | Performance: Very Good