Để xây dựng mô hình đánh giá, dự báo bằng ngôn ngữ lập trình R, ngoài việc sử dụng các hàm từ các gói có sẵn trong các thư viện của R, cần phải xây dựng các hàm riêng cho phù hợp với mục tiêu đặt ra đối với từng tập dữ liệu. Vì vậy, hiểu nguyên lý hoạt động của một hàm trong ngôn ngữ lập trình R là cần thiết, ví dụ như như cách một hàm được tạo ra; cách gọi hàm; cách thức tham số truyền vào một hàm; cách thức chuyển đổi giữa các hàm,…
Tạo hàm
Để tạo một hàm trong R, sử dụng lệnh “function()”.
“function()” được thiết kế như sau:
ở đây,
“f” là tên hàm;
“arguments” là các tham số;
“statements” là câu lệnh.
Tham số
Tham số là giá trị được truyền vào hàm, các tham số được phân tách bằng dấu phẩy trong ngoặc đơn. Hàm phải được gọi với số lượng tham số chính xác, không ít hơn hoặc nhiều hơn, nếu không sẽ báo lỗi.
Gọi hàm
Sau khi tạo hàm, chúng ta gọi hàm đó để thực thi mục tiêu; bằng cách viết tên hàm và truyền giá trị tham số.
Truyền tham số
Tham số được truyền vào hàm theo những trường hợp sau đây:
- Trường hợp 1: các tham số được truyền vào hàm theo cùng thứ tự như trong định nghĩa hàm.
- Trường hợp 2: các tham số được truyền vào hàm theo tên tham số mà không cần thứ tự.
- Trường hợp 3: các giá trị mặc định sẽ được sử dụng để thực thi hàm trong trường hợp các tham số không được truyền vào hàm.
Các loại hàm
Hàm là một tập hợp các câu lệnh được sắp xếp cùng nhau để thực hiện một mục tiêu cụ thể, là một đối tượng để trình thông dịch có thể truyền quyền điều khiển cho hàm, cùng với các tham số cần thiết để hàm thực hiện các lệnh. Hàm thực hiện nhiệm vụ và trả lại quyền điều khiển cho trình thông dịch cũng như bất kỳ giá trị trả về nào có thể được lưu trữ trong các đối tượng khác.
Có hai loại hàm: hàm tích hợp và hàm do người dùng định nghĩa.
Hàm tích hợp là hàm có sẵn trong ngôn ngữ lập trình R để thực thi các nhiệm vụ phổ biến; như hàm: sum(), max(), min(), abs(), sqrt(), round(), exp(), log(), cos(), sin(), tan(), mean(), median(), cor(), var(), unique(), subset(), aggregate(), order(), ….
Hàm do người dùng định nghĩa là hàm được thiết kế dựa trên các phép toán, vòng lặp, câu lệnh có sẵn trong R.
Tham số đóng vai trò là một hàm
Trong ngôn ngữ lập trình R thì các hàm có thể được truyền cho các hàm khác dưới dạng tham số.
Tham số giúp tăng cường các chức năng và khả năng sử dụng của các hàm, cho phép tạo mã linh hoạt và thân thiện với người dùng hơn.
Hàm đệ quy
Hàm đệ quy là hàm tự gọi chính nó. Điều này tạo thành một vòng lặp, trong đó mỗi lần hàm được gọi, nó sẽ tự gọi lại chính nó nhiều lần và kỹ thuật này được gọi là đệ quy. Hàm đệ quy phải có điều kiện dừng để chúng có thể dừng lặp.
Ở đây, hàm “rec_fac(5)” gọi “rec_fac(4)”, sau đó gọi “rec_fac(3)”, và cứ tiếp tục như vậy cho đến khi tham số x giảm đến 1 thì hàm trả về 1 và dừng vòng lặp. Giá trị trả về được nhân với giá trị tham số và giá trị được trả về, quá trình này tiếp tục cho đến khi lệnh gọi hàm đầu tiên trả về đầu ra của nó, cung cấp cho chúng ta kết quả cuối cùng.
Các loại hàm đệ quy
• Hàm đệ quy trực tiếp: là hàm gọi chính nó một cách trực tiếp. Kiểu hàm đệ quy này dễ hiểu nhất.
• Hàm đệ quy gián tiếp: là một chuỗi các lệnh gọi hàm, trong đó một hàm gọi một hàm khác, rồi hàm này lại gọi hàm ban đầu.
• Hàm đệ quy lẫn nhau: là nhiều hàm gọi nhau nhiều lần tạo nên đệ quy lẫn nhau. Để hoàn thành một nhiệm vụ, mỗi hàm phụ thuộc vào các hàm khác.
• Hàm đệ quy lồng nhau: là hàm đệ quy gọi một hàm đệ quy khác trong khi truyền đầu ra của lệnh gọi đầu tiên dưới dạng tham số. Các tham số của một hàm đệ quy được lồng bên trong hàm đệ quy này.
• Hàm đệ quy cấu trúc: là đệ quy dựa trên cấu trúc của dữ liệu được gọi là đệ quy cấu trúc. Nó bao gồm việc phân đoạn một cấu trúc dữ liệu phức tạp thành các phần nhỏ hơn và xử lý từng phần riêng biệt.
Đặc tính của hàm đệ quy
• Tự gọi chính nó.
• Đoạn mã ngắn và trực quan hơn.
• Giải pháp đơn giản cho một số trường hợp như bộ nhớ lưu trữ lớn, tham số nhỏ.
Ứng dụng của hàm đệ quy
Các hàm đệ quy được sử dụng trong nhiều kỹ thuật lập trình như ngôn ngữ lập trình động hoặc thuật toán chia để trị.
• Trong ngôn ngữ lập trình động: hàm đệ quy rất quan trọng đối với hiệu suất tính toán đối với cả hai phương pháp từ trên xuống và từ dưới lên.
• Trong thuật toán chia để trị: bằng cách phân hoạch một bài toán thành các bài toán nhỏ dễ giải quyết hơn. Sau đó, đầu ra được xây dựng ngược lên trên cùng. Hàm đệ quy cũng có một quy trình tương tự, vì vậy nó được sử dụng để giải quyết bài vấn đề này.
Hàm chuyển đổi
Đôi khi để phân tích dữ liệu, chúng ta cần chuyển đổi một kiểu dữ liệu sang một kiểu dữ liệu khác hoặc chuyển đổi một cấu trúc dữ liệu sang một cấu trúc dữ liệu khác. Trong R thì các hàm chuyển đổi này đã được tích hợp.
Hàm chuyển đổi cho các kiểu dữ liệu
Trong R có các kiểu dữ liệu sau: số thực, số nguyên, logic, ký tự,… R cung cấp các hàm chuyển đổi chuyển đổi kiểu dữ liệu sau đây:
• as.numeric(): dữ liệu được chuyển thành số.
• as.integer(): dữ liệu được chuyển thành giá trị số nguyên.
• as.character(): dữ liệu được chuyển thành giá trị chuỗi ký tự.
• as.logical(): dữ liệu trả về giá trị đúng/sai (TRUE/FALSE).
• as.date(): chuyển đổi chuỗi thành định dạng ngày tháng năm.
Hàm chuyển đổi cho cấu trúc dữ liệu
Có nhiều hàm chuyển đổi cấu trúc dữ liệu khác nhau có sẵn trong ngôn ngữ lập trình R, trong đó các hàm chuyển đổi thành data frame, vector và ma trận là các chuyển đổi phổ biến nhất.
Data Frame được sử dụng để lưu trữ các bảng dữ liệu, với danh sách các vectơ có độ dài bằng nhau. Trong ngôn ngữ lập trình R, đôi khi để phân tích dữ liệu, chúng ta cần chuyển đổi danh sách vectơ thành một data.frame. Vì vậy, đối với điều này, chúng ta sử dụng hàm “as.data.frame()” để chuyển đổi danh sách vectơ thành một data frame.
Hàm “as.vector()” được sử dụng để chuyển đổi một ma trận thành một vector.
Hàm “as.matrix()” được sử dụng để chuyển đổi dữ liệu dạng bảng thành ma trận.
Kết luận
Tạo hàm trong ngôn ngữ lập trình R là một nền tảng quan trọng trong phân tích, dự báo dữ liệu, giúp các nhà khoa học dữ liệu xây dựng được các hàm mục tiêu, qua đó giải quyết được các bài toán đã đề ra.
Nhất Luận
----------------------------------------
Tài liệu tham khảo:
[1] Functions. https://r4ds.had.co.nz/functions.html
[2] Functions in R Programming. https://www.geeksforgeeks.org/functions-in-r-programming/?ref=roadmap
[3] Function Arguments in R Programming. https://www.geeksforgeeks.org/function-arguments-in-r-programming/?ref=roadmap
[4] Types of Functions in R Programming. https://www.geeksforgeeks.org/types-of-functions-in-r-programming/?ref=roadmap
[5] Recursive Functions in R Programming. https://www.geeksforgeeks.org/recursive-functions-in-r-programming/?ref=roadmap
[6] Conversion Functions in R Programming. https://www.geeksforgeeks.org/conversion-functions-in-r-programming/?ref=roadmap