Dùng seq_along()
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 64 trên 78.
Đôi khi bạn cần cả giá trị của phần tử lẫn vị trí của nó trong vector. Duyệt trực tiếp qua các phần tử tuy gọn nhưng không cho bạn truy cập vào chỉ số. Hàm (function) seq_along() giải quyết vấn đề này bằng cách tạo ra một dãy chỉ số cho bất kỳ vector nào.
Hàm seq_along() trả về một dãy từ 1 đến độ dài của vector:
fruits <- c("apple", "banana", "cherry")
print(seq_along(fruits))Đầu ra:
[1] 1 2 3Bằng cách lặp qua các chỉ số này, bạn có thể truy cập cả vị trí lẫn giá trị:
fruits <- c("apple", "banana", "cherry")
for (i in seq_along(fruits)) {
cat(i, ":", fruits[i], "\n")
}Đầu ra:
1 : apple
2 : banana
3 : cherryCách tiếp cận này đặc biệt hữu ích khi bạn cần sửa đổi các phần tử ở vị trí cụ thể hoặc so sánh các phần tử với phần tử liền kề. Dùng seq_along() an toàn hơn 1:length(vec) vì cách này xử lý chính xác các vector rỗng, trả về một dãy rỗng thay vì 1:0.
Thử thách
DễBạn sẽ nhận một dòng đầu vào gồm các số được phân tách bằng dấu phẩy (ví dụ: 10,20,30,40,50).
Dùng seq_along() để lặp qua véc-tơ kèm theo các chỉ số:
- Tạo một véc-tơ từ đầu vào được phân tách bằng dấu phẩy
- Lặp qua véc-tơ bằng
seq_along()để lấy cả chỉ số và giá trị - Với mỗi phần tử, in ra chỉ số, giá trị và tổng lũy tích đến vị trí đó (tổng của tất cả phần tử từ vị trí 1 đến vị trí hiện tại)
Dùng cat() theo định dạng: Position X: VALUE (Running total: TOTAL), theo sau là một dòng mới.
Ví dụ, nếu đầu vào là:
5,10,15,20Đầu ra sẽ là:
Position 1: 5 (Running total: 5)
Position 2: 10 (Running total: 15)
Position 3: 15 (Running total: 30)
Position 4: 20 (Running total: 50)Giải thích: Ở vị trí 1, giá trị là 5 và tổng lũy tích là 5. Ở vị trí 2, giá trị là 10 và tổng lũy tích là 5+10=15. Ở vị trí 3, giá trị là 15 và tổng lũy tích là 5+10+15=30, v.v.
Gợi ý: Dùng sum(vector[1:i]) để tính tổng lũy tích đến vị trí i.
Tự làm thử
# Đọc đầu vào
con <- file("stdin", "r")
input_line <- suppressWarnings(readLines(con, n = 1))
close(con)
# Chuyển chuỗi phân tách bằng dấu phẩy thành vectơ số
numbers <- as.numeric(strsplit(input_line, ",")[[1]])
# TODO: Viết code bên dưới
# Dùng seq_along() để lặp qua vectơ
# Ở mỗi vị trí, in ra chỉ số, giá trị và tổng lũy kế
# Dùng cat() theo định dạng: Position X: VALUE (Running total: TOTAL)\nBà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 động3Toá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 định12Lặp qua các chuỗi
Lặp qua các phần tử của vectorDùng seq_along()Lặp qua các ký tự (strsplitCác hàm xử lý chuỗiTự luyện tập: Trình biên dịch R online