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] 42Dấ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] 42Sự 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.
Thử thách
DễBạn sẽ nhận được hai dòng đầu vào:
- 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) - 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:
- 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ố
- 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)
- 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)
- 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
- 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] 120Giả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: 24sum(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ư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
4Toán tử phần 2
Toán tử logic (AND, OR)Toán tử logic phần 2 (NOT)Ôn tập: logic đơn giảnLogic vector hóa phần 1Logic vector hóa phần 22Biến và kiểu dữ liệu
Kiểu dữ liệu sốKiểu dữ liệu số nguyênKiểu dữ liệu ký tựKiểu dữ liệu logicKiểm tra kiểu dữ liệuQuy tắc đặt tênGiá trị thiếu: NATóm tắt: tạo biến8Vòng lặp
Vòng lặp forVòng lặp whileBreakNext (continue)Ôn tập: giai thừaTạo dãy (seq, :)Vòng lặp lồng nhauÔn tập: đầu vào động11Vectơ
Tạo vectơ bằng c()Truy cập phần tử trong vectơChỉnh sửa vectơCác phép toán trên vectơÔn tập: vectơ giáÔn tập: vectơ đảo ngượcVectơ có tên14Danh sách trong R
Tạo danh sáchTruy cập phần tử trong danh sáchChỉnh sửa danh sáchDanh sách có tênÔn tập: Danh sách sản phẩm3Toán tử phần 1
Toán tử số họcPhép chia lấy phần nguyên và phép moduloToán tử gánÔn tập: phép tính đơn giảnToán tử so sánh6Nhập xuất cơ bản
In đầu raDùng cat để in đầu raĐầu ra với biếnĐọc đầu vào bằng readline()Cơ bản về chuyển đổi kiểuÔn tập: máy tính tuổiÔn tập: đúng hay sai9Hàm
Khai báo hàmĐối số hàmGiá trị trả vềÔn tập: hàm SigmaÔn tập: hàm xác thựcGiá trị tham số mặc địnhTự luyện tập: Trình biên dịch R online