Tài liệu Giới thiệu ngôn ngữ R

Tóm tắt Tài liệu Giới thiệu ngôn ngữ R: ...ễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN Giới thiệu ngôn ngữ R Trang 8 Ở đây, R không biết chúng ta có biến số nào, cho nên R liệt kê các biến số var1,var2, v.v Nhấp chuột vào cột var1 và thay đổi bằng cách gõ vào đó a. Nhấp chuột vào cột var2 và thay đổi bằng cách gõ vào đó b. Sau đó gõ số li... 6 N u 4.2 7 7 N am 5.9 8 8 N am 6.1 9 9 N am 5.9 10 10 N u 4.0 Chú ý lệnh print(arg) đơn giản liệt kê tất cả số liệu trong data.frame arg. Thật ra, chúng ta chỉ cần đơn giản gõ data3, kết quả cũng giống y như print(data3). 4.2.4 Nhập hai data.frame thành một: merge Giả dụ như chúng ..., 0.75, 1)), labels=c(“q1”, “q2”, “q3”, “q4”), include.lowest=TRUE) cut(age, breaks=quantiles(c(0, 0.25, 0.50, 0.75, 1)), labels=c(“q1”, “q2”, “q3”, “q4”), include.lowest=TRUE) .7. Tập hợp số liệu bằng cut2 (Hmisc)4 Hàm cut trên chia biến số theo giá trị của biến, chứ không dựa vào số ...

pdf28 trang | Chia sẻ: havih72 | Lượt xem: 106 | Lượt tải: 0download
Nội dung tài liệu Tài liệu Giới thiệu ngôn ngữ R, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
_liệu<-read.csv(“đường_dẫn_đến_file_csv”,HEADER=true) 
Tham số HEADER = true cho R biết chúng ta muốn chọn dòng đầu tiên của file xls 
làm tên của các cột. Sau khi thực hiện lệnh này chúng ta đã có một đối tượng chuNn của R để 
lưu trữ dữ liệu của file xls ban đầu. Chúng ta có thể lưu lại đối tượng này cho các lần làm 
việc sau băng lện save() đã được giới thiệu ở trên. 
4.2 Xử lý dữ liệu : 
Biên tập số liệu ở đây không có nghĩa là thay đổi số liệu gốc (vì đó là một tội lớn, một 
sự gian dối trong khoa học không thể chấp nhận được), mà chỉ có nghĩa tổ chức số liệu sao 
cho R có thể phân tích một cách hữu hiệu. N hiều khi trong phân tích thống kê, chúng ta cần 
phải tập trung số liệu thành một nhóm, hay tách rời thành từng nhóm, hay thay thế từ kí tự 
(characters) sang số (numeric) cho tiện việc tính toán. Trong chương này, tôi sẽ bàn qua một 
số lệnh căn bản cho việc biên tập số liệu. Chúng ta sẽ quay lại với dữ liệu chol trong ví dụ 1. 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 11 
> setwd(“c:/works/stats”) 
> chol <- read.table(“chol.txt”, header=TRUE) 
> attach(chol)
4.2.1 Kiểm tra số liệu trống không (missing value) 
Trong nghiên cứu, vì nhiều lí do số liệu không thể thu thập được cho tất cả đối tượng, 
hay không thể đo lường tất cả biến số cho một đối tượng. Trong trường hợp đó, số liệu trống 
được xem là “missing value” . R xem các số liệu trống không là N A. Có một số kiểm định 
thống kê đòi hỏi các số liệu trống không phải được loại ra (vì không thể tính toán được) trước 
khi phân tích. R có một lệnh rất có ích cho việc này: na.omit, và cách sử dụng như sau: 
> chol.new <- na.omit(chol) 
Trong lệnh trên, chúng ta yêu cầu R loại bỏ các số liệu trống không trong data.frame 
chol và đưa các số liệu không trống vào data.frame mới tên là chol.new. Chú ý lệnh trên chỉ 
là ví dụ, vì trong dữ liệu chol không có số liệu trống không. 
4.2.2 Tách rời dữ liệu: subset 
N ếu chúng ta, vì một lí do nào đó, chỉ muốn phân tích riêng cho nam giới, chúng ta có 
thể tách chol ra thành hai data.frame, tạm gọi là nam và nu. Để làm chuyện này,chúng ta 
dùng lệnh subset(data, cond), trong đó data là data.frame mà chúng ta muốn tách rời, và cond 
là điều kiện. Ví dụ:
> nam <- subset(chol, sex==”N am”) 
> nu <- subset(chol, sex==”N u”)
Sau khi ra hai lệnh này, chúng ta đã có 2 dữ liệu (hai data.frame) mới tên là nam và 
nu. Chú ý điều kiện sex == “N am” và sex == “N u” chúng ta dùng == thay vì = để chỉ điều 
kiện chính xác. Tất nhiên, chúng ta cũng có thể tách dữ liệu thành nhiều data.frame khác 
nhau với những điều kiện dựa vào các biến số khác. Chẳng hạn như lệnh sau đây tạo ra một 
data.frame mới tên là old với những bệnh nhân trên 60 tuổi: 
> old =60) 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 12 
> dim(old) 
[1] 25 8 
Hay một data.frame mới với những bệnh nhân trên 60 tuổi và nam giới: 
> n60 =60 & sex==”N am”) 
> dim(n60) 
[1] 9 8 
4.2.3 Chiết số liệu từ một data .frame 
Trong chol có 8 biến số. Chúng ta có thể chiết dữ liệu chol và chỉ giữ lại những biến 
số cần thiết như mã số (id), độ tuổi (age) và total cholestrol (tc). Để ý từ lệnh names(chol) 
rằng biến số id là cột số 1, age là cột số 3, và biến số tc là cột số 7. Chúng ta có thể dùng lệnh 
sau đây: 
> data2 <- chol[, c(1,3,7)] 
Ở đây, chúng ta lệnh cho R biết rằng chúng ta muốn chọn cột số 1, 3 và 7, và đưa tất 
cả số liệu của hai cột này vào data.frame mới có tên là data2. Chú ý chúng ta sử dụng ngoặc 
kép vuông [] chứ không phải ngoặc kép vòng (), vì chol không phải làm một function. Dấu 
phNy phía trước c, có nghĩa là chúng ta chọn tất cả các dòng số liệu trong data.frame chol. 
N hưng nếu chúng ta chỉ muốn chọn 10 dòng số liệu đầu tiên, thì lệnh sẽ là: 
> data3 <- chol[1:10, c(1,3,7)] 
> print(data3) 
id sex tc 
1 1 N am 4.0 
2 2 N u 3.5 
3 3 N u 4.7 
4 4 N am 7.7 
5 5 N am 5.0 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 13 
6 6 N u 4.2 
7 7 N am 5.9 
8 8 N am 6.1 
9 9 N am 5.9 
10 10 N u 4.0 
Chú ý lệnh print(arg) đơn giản liệt kê tất cả số liệu trong data.frame arg. Thật ra, 
chúng ta chỉ cần đơn giản gõ data3, kết quả cũng giống y như print(data3). 
4.2.4 Nhập hai data.frame thành một: merge 
Giả dụ như chúng ta có dữ liệu chứa trong hai data.frame. Dữ liệu thứ nhất tên là d1 
gồm 3 cột: id, sex, tc như sau: 
id sex tc 
1 N am 4.0 
2 N u 3.5 
3 N u 4.7 
4 N am 7.7 
5 N am 5.0 
6 N u 4.2 
7 N am 5.9 
8 N am 6.1 
9 N am 5.9 
10 N u 4.0 
Dữ liệu thứ hai tên là d2 gồm 3 cột: id, sex, tg như sau: 
id sex tg 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 14 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
6 6 N u 4.2 N u 1.5 
5 5 N am 5.0 N am 2.1 
4 4 N am 7.7 N am 1.1 
3 3 N u 4.7 N u 0.8 
2 2 N u 3.5 N u 2.1 
1 1 N am 4.0 N am 1.1 
id sex.x tc sex.y tg 
> d 
> d <- merge(d1, d2, by="id", all=TRUE) 
Hai dữ liệu này có chung hai biến số id và sex. N hưng dữ liệu d1 có 10 dòng, còn dữ 
liệu d2 có 11 dòng. Chúng ta có thể nhập hai dữ liệu thành một data.frame bằng cách dùng 
lệnh merge như sau: 
11 N u 1.7 
10 N u 1.9 
9 N am 5.4 
8 N am 1.5 
7 N am 2.6 
6 N u 1.5 
5 N am 2.1 
4 N am 1.1 
3 N u 0.8 
2 N u 2.1 
1 N am 1.1 
Giới thiệu ngôn ngữ R Trang 15 
7 7 N am 5.9 N am 2.6 
8 8 N am 6.1 N am 1.5 
9 9 N am 5.9 N am 5.4 
10 10 N u 4.0 N u 1.9 
11 11 N A N u 1.7 
Trong lệnh merge, chúng ta yêu cầu R nhập 2 dữ liệu d1 và d2 thành một và đưa vào 
data.frame mới tên là d, và dùng biến số id làm chuNn. Chúng ta để ý thấy bệnh nhân số 11 
không có số liệu cho tc, cho nên R cho là N A (một dạng “not available”). 
4.2.5 Mã hóa số liệu (data coding)
Trong việc xử lí số liệu dịch tễ học, nhiều khi chúng ta cần phải biến đổi số liệu từ 
biến liên tục sang biến mang tính cách phân loại. Chẳng hạn như trong chNn đoán loãng 
xương, những phụ nữ có chỉ số T của mật độ chất khoáng trong xương (bone mineral density 
hay BMD) bằng hay thấp hơn -2.5 được xem là “loãng xương”, những ai có BMD giữa -2.5 
và -1.0 là “xốp xương” (osteopenia), và trên -1.0 là “bình thường”. Ví dụ, chúng ta có số liệu 
BMD từ 10 bệnh nhân như sau: 
-0.92, 0.21, 0.17, -3.21, -1.80, -2.60, -2.00, 1.71, 2.12, -2.11 
Để nhập các số liệu này vào R chúng ta có thể sử dụng function c như sau: 
bmd <- c(-0.92,0.21,0.17,-3.21,-1.80,-2.60,-2.00,1.71,2.12,-2.11) 
Để phân loại 3 nhóm loãng xương, xốp xương, và bình thường, chúng ta có thể dùng 
mã số 1, 2 và 3. N ói cách khác, chúng ta muốn tạo nên một biến số khác (hãy gọi là 
diagnosis) gồm 3 giá trị trên dựa vào giá trị của bmd. Để làm việc này, chúng ta sử dụng lệnh: 
# tạm thời cho biến số diagnosis bằng bmd 
> diagnosis <- bmd 
# biến đổi bmd thành diagnosis 
> diagnosis[bmd <= -2.5] <- 1 
> diagnosis[bmd > -2.5 & bmd <= 1.0] <- 2 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 16 
> diagnosis[bmd > -1.0] <- 3 
# tạo thành một data frame 
> data <- data.frame(bmd, diagnosis) 
# liệt kê để kiểm tra xem lệnh có hiệu quả không 
> data 
bmd diagnosis 
1 -0.92 3 
2 0.21 3 
3 0.17 3 
4 -3.21 1 
5 -1.80 2 
6 -2.60 1 
7 -2.00 2 
8 1.71 3 
9 2.12 3 
10 -2.11 2 
.2.5.1 Biến đổi số liệu bằng cách dùng replace 4
Một cách biến đổi số liệu khác là dùng replace, dù cách này có vẻ rườm rà chút ít. 
Tiếp tục ví dụ trên, chúng ta biến đổi từ bmd sang diagnosis như sau: 
> diagnosis <- bmd 
> diagnosis <- replace(diagnosis, bmd <= -2.5, 1) 
> diagnosis -2.5 & bmd <= 1.0, 2) 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 17 
> diagnosis -1.0, 3) 
.2.5.2 Biến đổi thành yếu tố (factor) 4
Trong phân tích thống kê, chúng ta phân biệt một biến số mang tính yếu tố (factor) và 
biến số liên tục bình thường. Biến số yếu tố không thể dùng để tính toán như cộng trừ nhân 
chia, nhưng biến số số học có thể sử dụng để tính toán. Chẳng hạn như trong ví dụ bmd và 
diagnosis trên, diagnosis là yếu tố vì giá trị trung bình giữa 1 và 2 chẳng có ý nghĩa thực tế gì 
cả; còn bmd là biến số số học. N hưng hiện nay, diagnosis được xem là một biến số số học. Để 
biến thành biến số yếu tố, chúng ta cần sử dụng function factor như sau: 
> diag <- factor(diagnosis) 
> diag 
[1] 3 3 3 1 2 1 2 3 3 2 
Levels: 1 2 3
Chú ý R bây giờ thông báo cho chúng ta biết diag có 3 bậc: 1, 2 và 3. N ếu chúng ta 
yêu cầu R tính số trung bình của diag, R sẽ không làm theo yêu cầu này, vì đó không phải là 
một biến số số học: 
> mean(diag) 
[1] N A 
Warning message: 
argument is not numeric or logical: returning N A in: mean.default(diag)
Dĩ nhiên, chúng ta có thể tính giá trị trung bình của diagnosis: 
> mean(diagnosis) 
[1] 2.3 
nhưng kết quả 2.3 này không có ý nghĩa gì trong thực tế cả. 
.2.6 Chia nhóm bằng cut 4
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 18 
Với một biến liên tục, chúng ta có thể chia thành nhiều nhóm bằng hàm cut. Ví dụ, 
chúng ta có biến age như sau: 
> age <- c(17,19,22,43,14,8,12,19,20,51,8,12,27,31,44) 
Độ tuổi thấp nhất là 8 và cao nhất là 51. N ếu chúng ta muốn chia thành 2 nhóm tuổi: 
> cut(age, 2) 
[1] (7.96,29.5] (7.96,29.5] (7.96,29.5] (29.5,51] (7.96,29.5] (7.96,29.5] 
(7.96,29.5] (7.96,29.5] 
[9] (7.96,29.5] (29.5,51] (7.96,29.5] (7.96,29.5] (7.96,29.5] (29.5,51] 
(29.5,51] 
Levels: (7.96,29.5] (29.5,51]
cut chia biến age thành 2 nhóm: nhóm 1 tuổi từ 7.96 đến 29.5; nhóm 2 từ 29.5 đến 51. 
Chúng ta có thể đếm số đối tượng trong từng nhóm tuổi bằng hàm table như sau: 
> table(cut(age, 2)) 
(7.96,29.5] (29.5,51] 
11 4 
> ageg <- cut(age, 3, labels=c("low", "medium", "high")) 
[1] low low low high low low low low low high 
low low medium medium 
[15] high 
Levels: low medium high 
> ageg <- cut(age, 3, labels=c("low", "medium", "high")) 
> table(ageg) 
ageg 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 19 
low medium high 
10 2 3 
Tất nhiên, chúng ta cũng có thể chia age thành 4 nhóm (quartiles) bằng cách cho 
những thông số 0, 0.25, 0.50 và 0.75 như sau: 
cut(age, 
breaks=quantiles(age, c(0, 0.25, 0.50, 0.75, 1)), 
labels=c(“q1”, “q2”, “q3”, “q4”), 
include.lowest=TRUE) 
cut(age, 
breaks=quantiles(c(0, 0.25, 0.50, 0.75, 1)), 
labels=c(“q1”, “q2”, “q3”, “q4”), 
include.lowest=TRUE)
.7. Tập hợp số liệu bằng cut2 (Hmisc)4
Hàm cut trên chia biến số theo giá trị của biến, chứ không dựa vào số mẫu, cho nên số 
lượng mẫu trong từng nhóm không bằng nhau. Tuy nhiên, trong phân tích thống kê, có khi 
chúng ta cần phải phân chia một biến số liên tục thành nhiều nhóm dựa vào phân phối của 
biến số nhưng số mẫu bằng hay tương đương nhau. Chẳng hạn như đối với biến số bmd 
chúng ta có thể “cắt” dãy số thành 3 nhóm với số mẫu tương đương nhau bằng cách dùng 
function cut2 (trong thư viện Hmisc) như sau: 
> # nhập thư viện Hmisc để có thể dùng function cut2 
> library(Hmisc) 
> bmd <- c(-0.92,0.21,0.17,-3.21,-1.80,-2.60,-2.00,1.71,2.12,-2.11) 
> # chia biến số bmd thành 2 nhóm và để trong đối tượng group 
> group <- cut2(bmd, g=2) 
> table(group) 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 20 
group 
[-3.21,-0.92) [-0.92, 2.12] 
5 5 
N hư thấy qua ví dụ trên, g = 2 có nghĩa là chia thành 2 nhóm (g = group). R tự động 
chia thành nhóm 1 gồm giá trị bmd từ -3.21 đến -0.92, và nhóm 2 từ -0.92 đến 2.12. Mỗi 
nhóm gồm có 5 số. 
Tất nhiên, chúng ta cũng có thể chia thành 3 nhóm bằng lệnh: 
> group <- cut2(bmd, g=3) 
Và với lệnh table chúng ta sẽ biết có 3 nhóm, nhóm 1 gồm 4 số, nhóm 2 và 3 mỗi 
nhóm có 3 số: 
> table(group) 
group 
[-3.21,-1.80) [-1.80, 0.21) [ 0.21, 2.12] 
4 3 3
5. Tính toán dòng lệnh trong R : 
R cung cấp rất nhiều các phép toán và các hàm (function) đa dạng để phuc vụ cho 
việc tính toán , hầu hết các hám số thông dụng đều được hỗ trợ bởi R. N goài ra còn rất nhiều 
các hàm phục vụ cho cho các công việc tính toán phức tạp và nâng cao cũng được cung cấp 
bởi rất nhiều các gói mở rộng dành cho R. Chúng ta có thể tải các gói mở rông đó tại địa chỉ 
sau: 
Chọn mục packages sau đó bạn có thể tải các gói cần thiết một cách dễ dàng . Các gói 
này là hoàn toàn miễn phí. 
Sau đây là một số lệnh đơn giản dung để tính toán của R : 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 21 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 22 
6. Lập trình với ngôn ngữ R : 
6.1 Tổng quan về lập trình với R : 
N gôn ngữ R có rất nhiều ưu điểm so với các ngôn ngữ lập trình bậc cao như C , C++ , 
Java. 
• R có khả năng điều khiển dữ liệu và lưu trữ số liệu, R còn có tính nguyên bản. 
• R cho phép sử dụng ma trận đại số. 
• Có thể sử dụng bảng băm và các biểu thức chính quy 
• R cũng hỗ trợ lập trình hướng đối tượng. 
• Khả năng biểu diễn đồ họa phong phú. 
• N gôn ngữ R cũng cung cấp các cấu trúc điều khiển cơ bản như các ngôn ngữ lập 
trình bậc cao khác. Ví dụ như : 
Ifelse;while.;forv..v.. 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 23 
R cũng có một số nhược điểm hay có thể gọi là thiếu sót , tuy nhiên các nhược điểm 
này có thể được khắc phục dễ dàng bởi chính R : 
• R không phải là một cơ sở dữ liệu nhưng lại có thể kết nối với các hệ quán trị cơ 
sở dữ liệu (DBMS) 
• R không có giao diện đồ họa người dùng, nhưng nó co thể kết nối với Java, TclTk. 
• Việc diễn giải ngôn ngữ R có thể rất chậm, nhưng có thể cho phép gọi tới các mã 
C hoặc C++. 
• R không có các bảng tính quan sát dữ liệu, nhưng nó có thể kết nối với 
Excel/MSOffice. 
• Mỗi câu lệnh của R kết thúc bằng phím Enter, điều này gây ra sự bất tiện trong khi 
lâp trình, đặt biệt là khi xây dựng một hàm, chỉ cần sai một dòng lệnh, ta sẽ phải 
làm lại từ đầu. 
• Một nhược điểm khác của R là nó không chuyên nghiệp và không hỗ trợ thương 
mại . 
6.2 Các kiểu dữ liệu cơ bản sử dụng trong lập trình với R : 
N gôn ngữ R không bắt buộc phải khai báo kiểu dữ liệu ngay khi khai báo 1 biến , kiểu 
dữ liệu của một biến sẽ được xác định khi ta gán một giá trị cụ thể cho nó. 
R gồm có 4 kiểu dữ liệu cơ bản : 
- numeric (kiểu số): 
- character 
- string 
- logical 
Khác với các ngôn ngữ lập trình bậc cao, các giá trị số trong R không chia thành kiểu 
thực(real) và kiểu nguyên(integer). Dữ liệu kiểu số trong R chỉ có 1 kiểu duy nhất. Ví dụ : 
>a<-10 
>b<-1.5 
Dấu “<-”tương tự với phép gán “=” trong các ngôn ngữ lập trình bậc cao, chúng ta 
cũng có thể thay dấu “<-” bởi dấu “=” nhưng được khuyến cáo là nên sử dụng dấu “<-”. 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 24 
Kiểu character và string trong R cũng tương tự như trong các ngôn ngữ lập trình bậc 
cao. Các giá trị char và string được đặt trong cặp dấu “”. Ví dụ : 
>a<-“nguyen trung kien” 
>b<-“a” 
Kiểu logical tương tự như kiểu bool (giá trị logic ) trong các ngôn ngữ lập trình bậc 
cao. Kiểu dữ liệu này chỉ gồm 2 giá trị đúng hoặc sai. Ví dụ : 
>a<-((1+3)==4) 
>a 
[1]TRUE 
6.3 Các kiểu dữ liệu tuyến tính trong R : 
Ở đây ta sẽ tìm hiểu về 2 kiểu dữ liệu tuyến tính trong R là array và list. 
Một mảng (array) trong R được khai báo theo cú pháp sau : 
>a<- c(1,2,3,4) 
>a[3] 
[1]3 
Khác với mảng, list trong R cũng là một dãy các phần tử nhưng chúng được gọi theo 
tên của phần tử được đặt khi khai báo, ví dụ khai báo một list : 
>kien<-list(name=”kien”,class=”k57b”,age=21) 
>kien$name 
[1]”kien” 
>kien$class 
[1]”k57b” 
>kien$age 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 25 
[1]”21” 
6.4 Các cấu trúc điều khiển cơ bản trong R : 
N gôn ngữ R cung cấp cho chúng ta các cấu trúc điều khiển cơ bản như trong đa số các 
ngôn ngữ lập trình bậc cao khác 
6.4.1 Cấu trúc rẽ nhánh : 
- Cấu trúc ifelse..: 
Cú pháp : 
if(biểu_thức_logic){khối_lệnh_1}else{khối_lệnh_2} 
khối_lênh_1 được thực hiện nếu biểu thức logic trong dấu ngoặc trả về kết quả true 
(đúng), trong trường hợp ngược lại thì khối_lênh_2 sẽ đc thực hiện. 
Ví dụ : 
if(1==0){print(1)}else{print} 
- Cấu trúc ifelse: 
Cú pháp : ifelse(Biểu thức logic, khối lệnh 1, khối lệnh 2) 
Khối lệnh 1 được thực hiện khi biểu thức logic trả về TRUE, ngược lại thì sẽ 
thực hiện khối lệnh 2. 
Ví dụ: 
 x <- 1:10 
 ifelse(x8, x, 0) 
6.4.2 Cấu trúc lặp : 
- Cấu trúc lặp với số lần lặp đã xác định for : 
Cú pháp : 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 26 
for(biến_điều_khiển in khoảng_giá_trị) { 
 đoạn_lệnh_cần_lặp 
 } 
Ví dụ : 
x <- 1:10; z <- NULL 
 for(i in seq(along=x)) { 
 if (x[i]<5) { z <- c(z,x[i]-1) } else { z <- c(z,x[i]/x[i]) } 
 } 
- Cấu trúc lặp với số lần lặp không biết trước : 
>while(điều_kiện_lặp){đoạn_lệnh_cần_lặp} 
Trong cấu trúc lặp này , đoạn lệnh cần lặp sẽ được thực hiện trong khi biểu_thức_điều_kiện 
còn đúng . Ví dụ : 
>i=0 
>while(i<5){print(i) 
i=i+1 
} 
Trong R một đoạn lệnh được đóng gói bởi một cặp dấu “{}”, vì vậy khi bắt đầu thực 
hiện một đoạn lệnh bởi dấu “{” các câu lệnh trong đoạn lệnh sẽ không được thực thi ngay sau 
khi nhấn Enter, lúc đó con trỏ dòng lệnh sẽ chuyển sang dấu ”+” , khi chương trình gặp dấu 
“}” thì đoạn lệnh trong cặp dấu “{}” mới được thực thi. 
6.5 Xây dựng hàm trong R : 
Cú pháp định nghĩa một hàm trong R : 
>myfct <- function(arg1, arg2, ...) { function_body } 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 27 
Giá trị được trả về bởi một hàm là giá trị được tạo bởi thân hàm đó , giá trị này 
thường được trả về trong dòng lệnh cuối của thân hàm , ví dụ ta có thể dùng câu lệnh return() 
để trả về giá trị của hàm . 
Cú pháp khi gọi một hàm đã được định nghĩa : 
myfct(arg1=..., arg2=...) 
Các quy tắc cú pháp : 
• Thông thường : 
Các chức năng được định nghĩa bằng việc gán bởi từ khóa “function”. Phần khai báo 
các tham số được đặt trong cặp dấu () , các tham số được ngăn cách bởi dấu “,”. Các câu lệnh 
thực hiện chức năng của hàm nằm trong phần thân hàm giữa hai dấu ”{}” , cần phải gán tên 
cho hàm để có thể gọi lại sau này. 
• Cách đặt tên hàm : 
Tên hàm gần như có thể đặt bằng bất cứ cách nào, tuy nhiên cần tránh đặt tên hàm 
trùng các hàm sẵn có trong R. 
• Chức năng của phần thân hàm : 
Tại đây các câu lệnh điều khiển và thực hiện chức năng của hàm được khai báo. Các 
câu lệnh riêng biệt được ngăn cách nhau bởi dấu “;” 
• Phạm vi của biến : 
Một biến được khai báo trong một hàm sẽ chỉ tồn tại trong thời gian hoạt động của 
hàm đó. Vì vậy, chúng ta không thể gọi tới 1 biến được khai báo bên trong một hàm từ bên 
ngoài hàm đó . Chúng ta có thể làm điều này bằng cách khai báo biến là một biến toàn cục 
với toán tử “<<-” thay vì toán tử gán “<-” thông thường. 
Ví Dụ: viết hàm so sánh 2 số a và b 
sosanh <- function(a,b) 
{ 
if(a >= b) 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 
Giới thiệu ngôn ngữ R Trang 28 
{return (TRUE)}else{return (FALSE)} 
}
Ví dụ: giải phương trình bậc 2: 
giai <- function(a,b,c) 
{if(a==0) 
{ifelse(b==0,result <- c("pt vo nghiem"),result <- -c/b)} 
else 
{delta <- b*b-4*a*c 
if(delta > 0) 
{ 
re1 <- (-b+sqrt(delta))/2*a 
re2 <- (-b-sqrt(delta))/2*a 
result <- c(re1,re2) 
} 
else{if(delta == 0){result <- -b/2*a}else{ 
result <- c("pt vo nghiem")} 
} 
} 
return (result) 
} 
Bùi Quang Hà & Nguyễn Trung Kiên – K57 Khoa CNTT - ĐHSPHN 

File đính kèm:

  • pdftai_lieu_gioi_thieu_ngon_ngu_r.pdf