Menu

Cú pháp R cơ bản trong 5 phút

Phần cốt lõi của cú pháp R: phép gán với <-, biểu thức và tự động in kết quả, gọi hàm với đối số có tên, và quy tắc mọi thứ đều là vector.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Biểu thức và tự động in kết quả

R là ngôn ngữ dựa trên biểu thức: gần như mọi dòng bạn viết đều tạo ra một giá trị. Ở console, một biểu thức được gõ riêng sẽ được tính và giá trị của nó được in ra tự động, không cần print():

Mỗi kết quả có tiền tố [1]: đó là R cho bạn biết vị trí của giá trị đầu tiên được hiển thị, gợi ý đầu tiên rằng R tư duy bằng vector (xem thêm bên dưới). Tự động in có một điểm cần biết ngay từ ngày đầu: nó chỉ áp dụng cho các biểu thức đứng riêng ở cấp cao nhất. Cùng biểu thức đó đặt trong thân hàm hay trong vòng lặp for sẽ không in gì, đó là lý do các script dùng cat() hoặc print() tường minh cho những đầu ra bạn cần thấy.

Phép gán: mũi tên

Toán tử gán của R là <-, một mũi tên chỉ vào tên nhận giá trị:

Hãy đọc radius <- 5 là "radius nhận 5". Đúng vậy, = cũng dùng được để gán ở cấp cao nhất, và đúng vậy, người mới thường hỏi vì sao lại gõ hai ký tự thay vì một. Câu trả lời là một quy ước được tuân thủ nghiêm ngặt: mọi bộ quy tắc viết code lớn, tài liệu của base R và gần như toàn bộ code R bạn từng đọc đều dùng <- để gán, dành = cho một việc cụ thể: đặt tên đối số bên trong lời gọi hàm (phần tiếp theo). Theo quy ước này, hai thao tác trông khác nhau rõ ràng. Trong RStudio, Alt+- (Option+- trên macOS) gõ mũi tên giúp bạn.

Lưu ý rằng phép gán không tự động in ra: area <- 78.5 lưu giá trị một cách im lặng. Đó là lý do đoạn code trên cần print().

Phân biệt chữ hoa chữ thường

R phân biệt chữ hoa chữ thường một cách nghiêm ngặt, cả với tên bạn tạo lẫn tên do ngôn ngữ cung cấp:

Đây là hai biến khác nhau. Tương tự, mean() là một hàm còn Mean() thì không tồn tại. Khi R chào bạn bằng object 'x' not found hoặc could not find function, hãy kiểm tra chữ hoa chữ thường trước tiên: đó là lỗi phổ biến nhất của người mới.

Gọi hàm và đối số có tên

Hàm được gọi bằng dấu ngoặc tròn, các đối số cách nhau bằng dấu phẩy. Đối số có thể được khớp theo vị trí, theo tên, hoặc kết hợp cả hai:

Lệnh gọi seq() cho thấy cú pháp đối số có tên của R, và đây là nơi = phát huy tác dụng: bên trong một lời gọi, name = value gắn nhãn cho một đối số. Đối số có tên giúp bạn không phải nhớ thứ tự tham số, và khiến lời gọi tự giải thích; seq(0, 100, 25) chạy giống hệt nhưng cho người đọc biết ít hơn. Quy ước thực tế: truyền đối số đầu tiên (thường là dữ liệu) theo vị trí, đặt tên cho các đối số còn lại.

Xem trợ giúp cho bất kỳ hàm nào chỉ mất một thao tác: gõ ?seq ở console để mở tài liệu của nó.

Mọi thứ đều là vector

Ý tưởng khiến R khác biệt với các ngôn ngữ khác: không có con số đơn lẻ trần trụi. Ngay cả 5 cũng là một vector độ dài một, và các phép toán áp dụng theo từng phần tử cho cả vector:

Không có vòng lặp nào, vậy mà mọi phần tử đều được chuyển đổi. Ở hầu hết ngôn ngữ, đó là ba lần lặp của vòng lặp for; trong R, đó chỉ là phép tính số học. Đây là vector hóa (vectorization), và nó định hình mọi thứ: toán tử so sánh, hàm xử lý chuỗi và hàm toán học đều hoạt động theo cách này. Đó là lý do code R chuẩn mực có ít vòng lặp hơn nhiều so với bạn nghĩ; câu chuyện đầy đủ nằm ở vector.

Dấu ngoặc nhọn và khối lệnh

Phần thân nhiều dòng, cho if, vòng lặp và hàm, được nhóm bằng dấu ngoặc nhọn {}:

Có hai điều cần để ý. Điều kiện nằm trong dấu ngoặc tròn, và đó là if đơn thuần, không phải if: hay if ... then. Và khác với Python, thụt lề không mang ý nghĩa gì trong R: dấu ngoặc nhọn xác định khối lệnh, còn thụt lề là để con người đọc. Bỏ dấu ngoặc nhọn với lệnh một dòng là hợp lệ nhưng là nguồn bug kinh điển khi sửa code; cứ luôn dùng chúng.

Khoảng trắng và dấu chấm phẩy

R bỏ qua khoảng trắng thừa, và xuống dòng là kết thúc một câu lệnh, không cần dấu chấm phẩy:

Việc chia thành nhiều dòng hoạt động được vì dòng 3 kết thúc bằng +, nên R biết biểu thức chưa xong. Đó là quy tắc duy nhất cần nhớ khi ngắt dòng dài: ngắt sau một toán tử hoặc dấu phẩy, không bao giờ ngắt trước, nếu không R sẽ coi dòng đầu là đã hoàn chỉnh. Dấu chấm phẩy chỉ tồn tại để nhét hai câu lệnh vào một dòng (a <- 1; b <- 2): hợp lệ, không được khuyến khích, dễ dàng tránh được.

Phong cách: code R được viết thế nào

Ngoài ngữ pháp, R có những quy ước cộng đồng mạnh mẽ (được hệ thống hóa trong bộ quy tắc viết code của tidyverse, mà phần lớn hệ sinh thái tuân theo):

  • <- để gán, = chỉ dùng cho đối số bên trong lời gọi hàm.
  • Tên dạng snake_case: monthly_revenue, không phải monthlyRevenue hay monthly.revenue. Dấu chấm hợp lệ trong tên ở R nhưng tốt nhất nên tránh, vì chúng trùng với một kiểu đặt tên mà phần bên trong của R sử dụng.
  • Khoảng trắng quanh toán tử (x <- a * 2, không phải x<-a*2) và sau dấu phẩy.
  • Thụt lề bốn khoảng trắng bên trong dấu ngoặc nhọn (một số nhóm dùng hai; hãy chọn một và giữ nhất quán).
  • Mỗi dòng một câu lệnh.

Trình thông dịch không bắt buộc điều nào trong số này. Nhưng bất kỳ ai đọc code của bạn đều đòi hỏi tất cả. Phần về đặt tên được tiếp tục ở biến.

Những điều cần nhớ

  • R tính các biểu thức và tự động in các biểu thức đứng riêng ở console, nhưng không in bên trong hàm hay vòng lặp.
  • Gán bằng <- ("nhận"); chỉ dùng = để đặt tên đối số trong lời gọi hàm.
  • R phân biệt hoàn toàn chữ hoa chữ thường: gõ sai chữ hoa là nguyên nhân của phần lớn lỗi "not found" ban đầu.
  • Mọi thứ đều là vector, và phép toán áp dụng theo từng phần tử: c(1, 2, 3) * 2 là 2 4 6, không cần vòng lặp.
  • Dấu ngoặc nhọn xác định khối lệnh, xuống dòng kết thúc câu lệnh, và snake_case cùng các quy ước khoảng trắng giúp code của bạn đọc giống code của mọi người.

Tiếp theo: chú thích, cách ghi chú cho code R, và phải làm gì khi R không có cú pháp chú thích khối.

Câu hỏi thường gặp

<- trong R nghĩa là gì?

<- là toán tử gán của R: x <- 5 lưu giá trị 5 dưới tên x. Hãy đọc nó là 'nhận'. = cũng gán được ở cấp cao nhất, nhưng quy ước của cộng đồng, được mọi bộ quy tắc viết code lớn áp dụng, là dùng <- để gán và chỉ dùng = để đặt tên đối số bên trong lời gọi hàm.

R có phân biệt chữ hoa chữ thường không?

Có, hoàn toàn. total, Total và TOTAL là ba tên khác nhau, và gọi Mean(x) thay vì mean(x) là lỗi, không phải cảnh báo. Lỗi 'could not find function' hay 'object not found' rất thường chỉ là gõ sai chữ hoa chữ thường.

Có cần dấu chấm phẩy trong R không?

Không. Xuống dòng là kết thúc một câu lệnh. Dấu chấm phẩy chỉ cần khi muốn nhét hai câu lệnh vào một dòng (a <- 1; b <- 2), điều mà các bộ quy tắc viết code vốn không khuyến khích. Hãy viết mỗi dòng một câu lệnh và quên dấu chấm phẩy đi.

R được vector hóa nghĩa là gì?

Các phép toán cơ bản của R làm việc trên cả vector cùng lúc. c(1, 2, 3) * 2 cho ra 2 4 6: phép nhân áp dụng cho mọi phần tử mà không cần vòng lặp. Phần lớn code mà ở ngôn ngữ khác phải viết bằng vòng lặp for thì trong R chỉ là một biểu thức.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu