Ngôn ngữ lập trình R

Từ Thư viện Khoa học VLOS
Bước tới: chuyển hướng, tìm kiếm

R là ngôn ngữ lâp trình thống kê sáng lập bởi nhóm tác giả "R Development Core Team" tại đại học đại học Auckland, do Ross Ihaka và Robert Gentleman khởi xướng và phát triển từ ngôn ngữ lập trình thống kê S. Do đặc trưng của phần mềm mã nguồn mở, R nhận được đóng góp xây dựng từ khắp các nơi trong cộng đồng khoa học. Thêm vào đó R kế thừa các ưu điểm của ngôn ngữ lập trình bậc cao nên nhanh chóng trở thành ngôn ngữ rất phổ biến trong thống kê, xử lý số liệu nói chung và đặc biệt là tin sinh học nói riêng.

Trong bài này chúng tôi giới thiệu các khái niệm cơ bản của ngôn ngữ lập trình R theo quan điểm lập trình cấu trúc là chủ yếu. Chúng tôi giả định bạn đọc hoàn toàn không có khái niệm về lập trình nói chung và R nói riêng, yêu cầu duy nhất là bạn đọc có máy tính và không sợ máy tính. Vì vậy bài viết thực hiện theo lối hướng dẫn và gợi ý phân tích, đi đến xây dựng một số khái niệm cơ bản của lập trình cấu trúc. Bạn đọc được đề nghị thực hiện theo hướng dẫn, cụ thể là gõ các câu lệnh yêu cầu vào máy (không nên dùng chức năng copy-paste), suy nghĩ theo ý kiến riêng và nếu muốn có thể tham khảo phân tích và dẫn dắt của chúng tôi. Mục tiêu của bài viết là giúp bạn đọc có kỹ năng suy nghĩ theo ngôn ngữ R, thuận tiện cho việc đọc các tài liệu sâu hơn, thêm vào đó một yếu tố quan trọng là biết khai thác các gói lệnh được xây dựng sẵn phục vụ cho mục đích học tập và nghiên cứu của mình.

Vì mục tiêu của bài này hướng đến đối tượng làm quen với R từ "dưới mức cơ bản", bạn đọc có kinh nghiệm về lập trình có thể bỏ qua phần hướng dẫn này và tham khảo trực tiếp các bài ở mức độ sâu hơn tại (đây) và các tài liệu tham khảo liệt kê cuối bài.

Download và cài đặt R

Bạn có thể download và cài đặt R theo chỉ dẫn ở đây. Công việc cài đặt với (đặc biệt với Windows) hoàn toàn đơn giản, bạn có thể bắt chước một người hoàn toàn không biết gì về máy tính, thậm chí không biết tiếng Anh: liên tục click vào ô chọn (OK) hoặc (next) cho đến khi "mọi thứ có vẻ đã... OK " cả rồi.

Một lưu ý nhỏ: Windows vốn không có độ tương thích cao với R, một số vấn đề kỹ thuật có thể xảy ra khi bạn sử dụng các công cụ nâng cao. Nhưng giả sử bạn và tôi là những người đơn giản, và cuộc sống của chúng ta cũng đơn giản như vậy. Sẽ không bao giờ ta phải làm các việc nâng cao, khi đó bạn có thể yên tâm với những gì mình có. Trường hợp xấu khi bạn bỗng nhiên trở thành người phức tạp thì bạn có thể sẽ phải thay đổi hệ điều hành! Tin vui là trong trường hợp bạn đã học được cách đổi hệ điều hành thì bạn đã nắm được tinh thần máy tính, bạn có thể trực tiếp bắt đầu với một giới thiệu nâng cao hơn.

R là một trình thông dịch (interpreter): Đối thoại với R

Sau khi cài đặt chúng ta khởi động R, với lệnh R trong linux hoặc một click kép lên biểu tượng R trong Windows. Cửa sổ giao diện R xuất hiện với lời giới thiệu về R và các thông tin về bản quyền. Kèm theo đó có thể có một số cảnh báo khác mà ta bàn đến sau.

R là một trình thông dịch, tức là R sẽ dịch các lệnh mà người dùng gõ vào thông qua của sổ giao diện cho máy tính hiểu và thực hiện. Về cơ bản, làm việc với R hoàn toàn giống như đối thoại với máy tính thông qua một phiên dịch viên. Trình thông dịch phân biệt với các trình biên dịch như Pascal, Fortran, C... Các trình biên dịch sẽ dịch một "văn bản chỉ thị" của người dùng thành các thao tác máy tính sẽ thực hiện giống như biên dịch viên dịch một cuốn sách.

>> xem chi tiết

Biến (variables) và hàm (functions)

Chúng ta bắt đầu với bài toán cơ bản: Tính diện tích hình chữ nhật S với hai cạnh a = 10 cm và b = 20 cm. Mời bạn thử:

> a = 10
 
> b = 20
 
> S = a * b

Bạn không nên thất vọng vì chưa thấy câu trả lời mong đợi (200 cm^2). Không cần vội vàng, ta cùng phân tích xem "chúng ta vừa làm gì?".

>> xem chi tiết

Các kiểu dữ liệu đơn giản thường gặp

Trên đây chúng ta đã gặp hai kiểu dữ liệu: dữ liệu số và dữ liệu xâu ký tự. Để phân biệt rõ hơn, ta làm "thí nghiệm" sau:

> x = '1'
 
> y = 1
 
> mode(x)
 
[1] "character"
 
> mode(y) 
 
[1] "numeric"

Hàm mode cho biết dạng dữ liệu được ghi trong biến. Ta thấy x chứa '1' là một ký tự, trong khi y chứa 1 là một số.

>> xem chi tiết

Dữ liệu có cấu trúc: vector, ma trận, bảng (data frame)

Giả sử ta muốn thực hiện sản xuất hàng loạt: Nếu ta bắt gặp bài toán phải tính diện tích của năm hình chữ nhật với chiều rộng 10, 20, 30, 40, 50 cm và chiều dài 15, 25, 35, 45, 55 cm. Bạn có thể kiên trì hơn tôi và gõ lần lượt năm lần theo bài toán mẫu trên, nhưng tôi sẵn sàng tăng số hình chữ nhật lên 100. R cho phép ta "sản suất hàng loạt" đơn giản và hiệu quả hơn nhiều:

> a = c(10,20,30,40,50)
> b = c(15,25,35,45,55)
> S = a * b
> S

>> xem chi tiết

Soạn thảo và thực thi một thực đơn (scripts)

Tương tác với R qua cửa sổ lệnh rõ ràng bất tiện. Giống như hai người nói chuyện với nhau, câu chuyện dễ lạc đề và khó điều khiển. Một cách khắc phục là người ta ghi lại các câu lệnh vào một tệp, một thực đơn. Thực đơn đơn thuần là chỉ dẫn để R làm việc nào trước, việc nào sau. 'Nghệ thuật lập trình cấu trúc xoay quanh việc sắp xếp việc nào trước việc nào sau để đạt được kết quả (giống như vo gạo, cho gạo vào nồi, đun sôi, chắt nước, ủ bếp để có cơm.) Có thể tưởng tượng R như một người giúp việc sẽ tuyệt đối tuân thủ các chỉ dẫn mà bạn đã ghi ra giấy giao lại. Một chỉ dẫn sai sẵn sàng dẫn đến hậu quả nghiêm trọng, thử tưởng tượng ta nấu cơm bằng cách: đun nước, chắt nước, ủ bếp, vo gạo và cho vào nồi!

Bạn có thể sử dụng bất cứ phần mềm soạn thảo đơn giản (plain text) nào để soạn một thực đơn (MS Word là không "đơn giản"!). Các phần mềm soạn thảo dành riêng cho R (hoặc bất cứ ngôn ngữ lập trình nào khác) thường hỗ trợ màu (high-light) cho câu lệnh đặc trưng, hay các từ khóa của ngôn ngữ đó. Tinn-R là phần mềm tiện lợi cho Windows, Smultron có thể là ứng cử viên tốt với Mac OS, Vim là đồng chí quen thuộc của Linux. Bạn hãy mở một trong các phần mềm đó, thử gõ một trong các câu lệnh ở trên, chẳng hạn ls() để thấy hiệu ứng của màu. Ngoài tác dụng vui mắt, màu sẽ giúp bạn nhìn được cấu trúc của chương trình, giống hệt như việc phân đề mục, gạch chân các từ quan trọng khi đọc sách.

Một ví dụ cơ bản cho scripts như sau, mời bạn thử:

#Author: Some name
#History:
#Sat 26 June: File created.
#---------------------------------------------------------------------
rm(list = ls());
print("Try the first sripts!");
 
A = 100;
B =  200;
D = A + B;
D
print("How nice is the first scripts of mine :P!");

Sau khi soạn thảo, bạn lưu tệp, với tên chẳng hạn "first.R" trong thư mục hiện hành. Từ cửa sổ lệnh bạn gõ source("first.R"), thực đơn sẽ được thực hiện.

Các câu bắt đầu bằng dấu "#" gọi là các ghi chú (comment). Các ghi chú lưu lại thông tin về thực đơn chỉ dành cho người viết khi muốn ghi lại lý do, giải thích thêm... R sẽ không đọc các dòng đó. Nói cách khác # = "bỏ qua dòng này" đối với R. Nói riêng phần đầu của scripts chứa các ghi chú về thông tin tệp khi soạn thảo, ghi lại lịch sử thay đổi với tệp. Người mới viết chương trình thường coi nhẹ các ghi chú. Mọi thứ khi bạn viêt đều rất rõ ràng, chẳng có gì đáng phải giải thích. Bạn cũng có thể thử nghiệm điều đó với chương trình đầu tiên của mình, bỏ qua đầu của thực đơn (header) cũng như các ghi chú để một tháng sau khi mở tệp nhận được một câu đố khó giải đáp "Tháng trước mình đã viết gì?"

Các câu lệnh của R như bạn thấy không khác gì khi viết vào cửa sổ lệnh (không có dấu nhắc lệnh, tất nhiên là vây, vì dấu đó của R chú không phải do bạn viết.) Các câu lệnh của R nên kết thúc bằng dấu chấm phảy (mặc dù R cho phép bỏ các dấu chấm phảy này, nhưng hãy tưởng tượng khi bạn muốn viết hai lệnh trên cùng một dòng?)

Cấu trúc điều khiển

Cấu trúc điều khiển là một trong những khái niệm trung tâp của lập trình các kiểu. Với mục tiêu làm quen, chúng tôi chỉ đề cập đến hai cấu trúc, và cũng ở dạng đơn giản nhất. Mục đích chỉ là để bạn không ngạc nhiên khi tình cờ hoặc cố ý tò mò liếc vào màn hình máy tính của một người bạn lập trình. Để thực sự thành thục trong lập trình R, bạn có thể bắt đầu chọn một tài liệu tham khảo đầy đủ mà chúng tôi nêu ở cuối bài.

Trong cuộc sống mỗi người luôn luôn phải dựa vào hoàn cảnh hiện tại của mình. Chẳng hạn "Nếu trời mưa thì ta đi dạo phố, trời nắng thì tốt nhất là ở nhà!" Khi viết một thực đơn bạn cũng sẽ gặp tình huống tương tự, chẳng hạn nếu điểm của A lớn hơn 9 thì A là học sinh giỏi. Điều đó sẽ được thực hiện bởi câu lệnh if dưới dạng

if (A > 9)
{
     print("A: excellent!");
     print("Congratulation!");
} else
{
    print("A: should try more!");
    print("Good luck!");
}

Câu lệnh if được hiểu khá tự nhiên như câu nói bằng tiếng Anh, "nếu thế này thì làm thế này..., mà nếu không thì làm thế này...", có lẽ không cần phải giải thích gì hơn nữa, ngoài việc bạn có thể bỏ phần "else" khi chỉ muốn "nếu thế này thì làm thế kia, còn nếu không phải thế thì... thôi (không quan tâm.)"

Bạn có thể để ý các dấu "{}" đã xuất hiện, các dấu đó được gọi là khối lệnh (block). Khối lệnh giống như một đoạn mà bạn muốn đối xử với nó như một lệnh nhìn từ ngoài vào. (giải thích:)

IF có lẽ là cấu trúc quan trọng nhất và thường gặp nhất trong cuộc sống hàng ngày cũng như khi viết chương trình. Chúng ta sẽ nói thêm một cấu trúc khác cũng rất thường gặp: cấu trúc lặp hữu hạn, hay vòng for. Hãy xem đoạn code sau

s = 0;
for (k in 1:100)
{
    s = s + k;
};

Đoạn code trên bạn thực hiện tính tổng 100 số 1. Đơn giản bạn thực hiện đi thực hiện lại quá trình cộng thêm 1 vào s. Mỗi lần thực hiện như vậy biến điều khiển vòng for k tăng lên một đơn vị, đến khi biến đó vượt giá trị 100 thì vòng lặp kết thúc.

R hỗ trợ một số cấu trúc điều khiển khác hơn, nhưng ta hãy tạm dừng ở đây, nghĩ một chút về cuộc sống một chút thì đa số với công việc của ta liên quan đến for và if. Với chúng bạn đã có thể giải quyết được rất nhiều công việc. Một người thầy bảo thủ hơn có thể sẽ bắt bạn chép phạt vô hạn định cho đến khi bạn thuộc lòng truyện Kiều. Cũng như vây trong R ta có vòng lặp vô hạn while để làm việc này. Như đã nói, ở bước đầu làm quen chúng ta hay tạm gác những "việc khó" như vậy.

Về đồ họa

Đồ họa của R là một đề tài rất rộng. Viết đôi ba lời để mô tả nó là điều không thể! Để có ý niệm về nó, ta hay tìm hiểu duy nhất một lênh: plot(), thậm chí ở dạng đơn giản nhất.

>X = seq(0,10,len = 100);
>Y = sin(X);
>plot(X,Y);

Kết quả bạn ắt có một đường sin đẹp đẽ.

Trong đoạn code trên, ta gặp lệnh seq() sẽ trả cho bạn một chuỗi bắt đầu từ 0 kết thúc tại 10, với độ dài 100 điểm. Bạn có có thể gọi X ra để quan sát nếu muốn.

Lệnh plot() ở dạng này đơn thuần lấy các điểm có tọa độ lưu trong X, và Y, chấm trên mặt phẳng toạ độ dưới dạng các chấm tròn. Bạn có thể nối chúng với nhau bằng (option variables) "type", có thể thay đổi khung đồ thị bằng "xlim" (giới hạn trục x), "ylim" (giới hạn trục y), tên trục xlab và ylab và tô màu đường đồ thị bằng "col". Ví dụ:

>plot(X,Y, type = "l", col  = "red", xlab = "Time", ylab = "Amplitude", xlim = c(-1,1),  ylim = c(0,10));

Với plot() thực tế bạn đã có thể thực hiện được rất nhiều yêu cầu cần thiết cho công việc. Các hiệu chỉnh tinh vi hơn có thể nảy sinh, khi đó bạn có thể tham khảo đến các cuốn sách rất dày về đồ họa trong R.

Trước khi kết thúc, tôi đề nghị bạn hãy thử lệnh

>plot(exp);

Với tất cả những gì chúng ta đã thảo luận tôi hi vọng là bạn sẽ ngạc nhiên, và sẽ tự đặt một câu hỏi hợp lý! Hãy chú ý rằng chúng ta không có X, Y, không có biến nào gọi là exp nữa, nhưng chúng ta vẫn có một đồ thị! Chúng tôi không nêu câu hỏi đó: nhưng câu trả lời sẽ liên quan đến những đặc tính ưu việt của R mà bạn chưa biết. Tin vui hơn nữa đó (tất nhiên) vẫn không phải là tất cả. Điều đó có nghĩa là có cả một lĩnh vực rộng lớn đang chờ bạn phía trước.

Các gói công cụ tại cran và bioconductor

Bạn hãy theo link nếu ở dưới đến trang web của cran và bioconductor. Khi đó bạn có thể thấy là "mình đang đứng trên vai những người khổng lồ."

Các bước trung gian trong một vấn đề nào đó của bạn thường đã có người thực hiện (thật may mắn) đâu đó trên thế giới này. Bạn có thể tìm thấy các gói công cụ thuộc về thể loại khác nhau, đặc biệt xoay quanh các lĩnh vực thống kê, xử lý ảnh, xử lý dữ liệu sinh học.

Cuối cùng, toàn bộ bài viết này thực ra hoàn toàn vô nghĩa nếu bạn là một "googler"! Có lẽ chỉ trừ chính câu này.


Tài liệu gợi ý

Liên kết đến đây