R
không những sử dụng trong những nghiên cứu khoa học của cá nhân mà còn có thể chia sẻ cho cộng đồng, tham gia vào những dự án lớn có nhiều người cùng phát triển mã lệnh. Do đó, rèn luyện một phong cách viết mã R
trong sáng, đẹp là việc cần thiết. Bài viết trình bày 1 số hướng dẫn viết và trình bày mã nguồn R
dựa trên các nguồn sau:
Kinh nghiệm của người viết khi lập trình với các ngôn ngữ khác như Java
, C#
, Python
, … và tham gia các dự án.
Bài viết trình bày những điểm mà tác giả thấy quan trọng nhất và dễ thực hiện, không đòi hỏi phải cài đặt thêm các công cụ phần mềm khác.
1 dự án phân tích dữ liệu điển hình không đơn thuần chỉ là viết mã nguồn R
mà nó gồm nhiều bước khác nhau với rất nhiều đầu ra, đầu vào, báo cáo, kết xuất dữ liệu. Khi dự án càng lớn thì mức độ phức tạp càng gia tăng. Việc tổ chức sắp xếp tài nguyên (chủ yếu là file) trong dự án giữ vai trò quan trọng để người phát triển có thể tìm kiếm truy xuất nhanh chóng tài nguyên mình cần. Tác giả đề nghị cách thức tổ chức project theo cấu trúc thư mục. Bạn có thể sử dụng R Project
của RStudio
. Mỗi một dự án được dành riêng cho 1 thư mục. Cấu trúc thư mục có thể tổ chức như dưới đây:
Trong đó:
rmarkdown
để viết presentation).rmarkdown
để viết document).Các file mã nguồn .R
hay .Rmd
được để ở ngoài các thư mục.
Dùng <-
thay vì =
khi thực hiện phép gán.
# Good
a <- 5
# Bad
a = 5
Tên biến nên dùng danh từ tiếng Anh, chữ nhỏ - lower case - và sử dụng _
để phân cách giữa các chữ. Tên biến nên gợi mở và liên quan đến bối cảnh của phân đoạn mã, tránh việc đặt tên biến khó hiểu hay cụt ngủn. Đặt tên biến tốt giúp người đọc hiểu nhanh chóng mã nguồn và bám sát tư tưởng của người viết mã. Tên biến tránh trùng lắp với các keyword
của R
.
# Good
day_one
day_1
# Bad
first_day_of_the_month
DayOne
dayone
djm1
a
b
c
chuoi1
vector101
data.frame
Tương tự tên biến, tên hàm nên sử dụng động từ tiếng Anh, phân cách giữa các chữ bằng _
, chữ nhỏ lower case và tránh sử dụng tên hàm trùng với các tên hàm của package đang sử dụng.
# Good
clean_data <- function(x){
}
# Bad
dataClean <- function(x){
}
Sử dụng khoảng trắng trước và sau bất kì 1 toán tử nào, thêm 1 khoảng trắng sau dấu phẩy ,
(tương tự như khi viết tiếng Anh).
# Good
average <- mean(feet / 12 + inches, na.rm = TRUE)
# Bad
average<-mean(feet/12+inches,na.rm=TRUE)
Đối với :
, ::
, :::
thì có thể không cần khoảng trắng:
# Good
x <- 1:10
base::get
# Bad
x <- 1 : 10
base :: get
Có thể sử dụng thêm khoảng trắng để canh dòng giúp mã nguồn dễ đọc hơn.
list(
total = a + b + c,
mean = (a + b + c) / n
)
Không sử dụng khoảng trắng trobng các đoạn mã lệnh giới hạn bởi [
và ]
, trừ khi đó là các dấu ,
# Good
if (debug) do(x)
diamonds[5, ]
# Bad
if ( debug ) do(x)
x[1,]
x[1 ,]
Trong quá trình viết mã, khi một luồng công việc được lặp đi lặp lại, bạn nên tham số hoá những đoạn code đó và viết thành function
. Thói quen này giúp mã nguồn ngắn hơn, dễ quản lý hơn khi nếu điều chỉnh thì chỉ cần điều chỉnh ở 1 nơi.
File mã nguồn nên được đặt tên theo kiểu chữ thường, giữa các chữ phân cách bằng -
. Extension của file là .R
.
# Good
fit-models.R
utility-functions.R
# Bad
foo.r
stuff.r
Mỗi 1 file R chỉ nên gồm những hoặc đoạn code có mối quan hệ với nhau xét về mặt ngữ nghĩa, không nên viết những file mã lệnh quá dài, gây ra khó khăn khi người đọc phải scroll lên xuống nhiều để nắm bắt ý tưởng. Nếu như việc thực thi các file diễn ra theo trình tự thì nên đặt số thứ tự cho file:
0-download.R
1-parse.R
2-explore.R
ngay hàng thẳng lối
Soạn mã lệnh cũng như trình bày văn bản, ngay hàng thẳng lối
giúp người đọc thoải mái, đồng thời có thể tách bạch được ý tưởng thành từng phân đoạn. Mỗi một dòng mã không nên kéo dài quá hơn 80 kí tự.
function
luôn được mở đầu và kết thúc với {
và }
và luôn dùng return
ở dòng lệnh gán giá trị trả về, cho dù function
đó chỉ có 1 lệnh đơn giản
# Good
calculate_mean <- function(x){
return(mean(x))
}
# Bad
calculate_mean <- function(x) mean(x)
long_function_name <- function(a = "a long argument",
b = "another argument",
c = "another long argument") {
}
Gọi 1 function có nhiều tham số
analysis_result <- analyze(a = "a long argument",
b = "another argument",
c = "another long argument")
hoặc vẽ 1 plot của ggplot với nhiều lớp phức tạp
ggplot(dat, aes(x = rating)) + geom_histogram(binwidth = .5, colour = "black", fill = "white") +
facet_grid(cond ~ .) +
geom_vline(data = cdat, aes(xintercept = rating.mean),
linetype = "dashed", size = 1, colour = "red")
Khi edit mã, thường sử dụng phím tab
để căn chỉnh. Nếu dựng RStudio, cần thiết lập bước tab
là 2 và đảm bảo bấm phím tab
thì các khoảng trắng sẽ được thêm vào như cấu hình dưới đây:
Viết và trình bày mã nguồn đẹp, gọn gàng, khúc chiết giúp dễ theo dõi và tăng hiệu năng làm việc.