Menu
CoddyTech

Truy cập phần tử trong danh sách

Thuộc phần Kiến thức nền tảng trong hành trình R của Coddy. Bài học 72 trên 78.

Danh sách dùng cú pháp khác để truy cập phần tử so với vector. Điểm khác biệt chính là giữa dấu ngoặc đơn [ ] và dấu ngoặc kép [[ ]].

Dấu ngoặc vuông kép trích xuất phần tử thực tế từ danh sách:

my_list <- list(42, "hello", TRUE)
print(my_list[[1]])

Đầu ra:

[1] 42

Dấu ngoặc vuông đơn trả về một danh sách con chứa phần tử đó, chứ không phải chính phần tử đó:

my_list <- list(42, "hello", TRUE)
print(my_list[1])

Đầu ra:

[[1]]
[1] 42

Sự khác biệt này quan trọng khi bạn muốn thao tác với giá trị thực tế. Nếu một phần tử trong danh sách là một vector, hai dấu ngoặc vuông cho phép bạn truy cập trực tiếp vào phần tử đó, rồi dùng chỉ số của vector:

my_list <- list(c(10, 20, 30), "text")
print(my_list[[1]][2])

Đầu ra:

[1] 20

Ở đây, my_list[[1]] lấy vector, còn [2] truy cập phần tử thứ hai của nó. Hãy nhớ: dùng [[ ]] khi bạn cần nội dung thực tế và [ ] khi bạn muốn một danh sách nhỏ hơn.

challenge icon

Thử thách

Dễ

Bạn sẽ nhận được hai dòng đầu vào:

  1. Ba giá trị thuộc các kiểu khác nhau, được phân tách bằng dấu phẩy (ví dụ: 100,hello,TRUE)
  2. Một danh sách số được phân tách bằng dấu phẩy, biểu thị một vector sẽ được lưu làm phần tử thứ tư (ví dụ: 5,10,15,20)

Thực hiện các thao tác sau:

  1. Tạo một danh sách gồm bốn phần tử: giá trị số, văn bản, giá trị logic và vector các số
  2. Dùng ngoặc vuông kép để trích xuất và in ra phần tử thứ hai (giá trị văn bản)
  3. Dùng ngoặc vuông đơn để trích xuất phần tử thứ ba và in ra kết quả (hãy chú ý sự khác biệt về định dạng đầu ra)
  4. Truy cập vector được lưu trong phần tử thứ tư bằng ngoặc vuông kép, sau đó dùng chỉ số vector để trích xuất và in ra giá trị thứ ba của vector
  5. In ra tổng tất cả các số trong phần tử thứ tư (truy cập vector bằng ngoặc vuông kép và dùng sum())

Ví dụ, nếu đầu vào là:

42,world,FALSE
8,16,24,32,40

Đầu ra sẽ là:

[1] "world"
[[1]]
[1] FALSE

[1] 24
[1] 120

Giải thích:

  • my_list[[2]] trích xuất giá trị văn bản thực tế: "world"
  • my_list[3] trả về một danh sách con chứa FALSE (hãy chú ý [[1]] trong đầu ra)
  • my_list[[4]][3] truy cập vector, sau đó lấy phần tử thứ ba của vector: 24
  • sum(my_list[[4]]) tính 8+16+24+32+40 = 120

Tự làm thử

# Đọc đầu vào
con <- file("stdin", "r")
input1 <- suppressWarnings(readLines(con, n = 1))  # Dòng đầu tiên: ba giá trị phân tách bằng dấu phẩy
input2 <- suppressWarnings(readLines(con, n = 1))  # Dòng thứ hai: các số phân tách bằng dấu phẩy để tạo vector
close(con)

# Tách dòng đầu vào đầu tiên thành các giá trị riêng
values <- strsplit(input1, ",")[[1]]
numeric_val <- as.numeric(values[1])
text_val <- values[2]
logical_val <- as.logical(values[3])

# Tách dòng đầu vào thứ hai thành vector số
vector_val <- as.numeric(strsplit(input2, ",")[[1]])

# TODO: Viết code của bạn bên dưới
# 1. Tạo danh sách gồm bốn phần tử: numeric_val, text_val, logical_val và vector_val
# 2. Dùng dấu ngoặc vuông kép [[ ]] để lấy và in ra phần tử thứ hai
# 3. Dùng dấu ngoặc vuông đơn [ ] để lấy và in ra phần tử thứ ba
# 4. Dùng dấu ngoặc vuông kép để truy cập phần tử thứ tư, rồi lấy giá trị thứ ba của nó
# 5. In ra tổng của tất cả các số trong phần tử thứ tư
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch R online