2  Quy trình làm việc: cơ bản

Bây giờ bạn đã có chút kinh nghiệm chạy mã R. Chúng tôi không đưa ra nhiều chi tiết, nhưng rõ ràng bạn đã nắm được những điều cơ bản, nếu không bạn đã ném cuốn sách này đi vì thất vọng rồi! Thất vọng là điều tự nhiên khi bạn bắt đầu lập trình bằng R vì nó rất khó tính về dấu câu, và chỉ một ký tự sai chỗ cũng có thể khiến nó phàn nàn. Nhưng trong khi bạn nên mong đợi sẽ hơi thất vọng, hãy an tâm rằng trải nghiệm này là bình thường và tạm thời: nó xảy ra với tất cả mọi người, và cách duy nhất để vượt qua là tiếp tục cố gắng.

Trước khi đi xa hơn, hãy đảm bảo bạn có nền tảng vững chắc trong việc chạy mã R và biết một số tính năng hữu ích nhất của RStudio.

2.1 Cơ bản về lập trình

Hãy xem lại một số kiến thức cơ bản mà chúng tôi đã bỏ qua cho đến nay vì muốn đưa bạn vào vẽ biểu đồ nhanh nhất có thể. Bạn có thể sử dụng R để thực hiện các phép tính toán cơ bản:

1 / 200 * 30
#> [1] 0.15
(59 + 73 + 2) / 3
#> [1] 44.66667
sin(pi / 2)
#> [1] 1

Bạn có thể tạo đối tượng mới bằng toán tử gán (assignment operator) <-:

x <- 3 * 4

Lưu ý rằng giá trị của x không được in ra, nó chỉ được lưu trữ. Nếu bạn muốn xem giá trị, gõ x vào console.

Bạn có thể kết hợp nhiều phần tử thành một vector với c():

primes <- c(2, 3, 5, 7, 11, 13)

Và phép tính số học cơ bản trên vector được áp dụng cho mọi phần tử của vector:

primes * 2
#> [1]  4  6 10 14 22 26
primes - 1
#> [1]  1  2  4  6 10 12

Tất cả các lệnh R tạo đối tượng, các lệnh gán (assignment), đều có cùng dạng:

object_name <- value

Khi đọc đoạn mã đó, hãy đọc trong đầu “tên đối tượng nhận giá trị”.

Bạn sẽ thực hiện rất nhiều phép gán, và <- khá phiền để gõ. Bạn có thể tiết kiệm thời gian với phím tắt của RStudio: Alt + - (dấu trừ). Lưu ý rằng RStudio tự động bao quanh <- bằng dấu cách, đây là thói quen định dạng mã tốt. Mã có thể rất khó đọc vào một ngày đẹp trời, vì vậy hãychodôimắtnghỉngơi và sử dụng dấu cách.

2.2 Chú thích

R sẽ bỏ qua mọi văn bản sau # trên dòng đó. Điều này cho phép bạn viết comment (comment), văn bản được R bỏ qua nhưng được người khác đọc. Đôi khi chúng tôi sẽ bao gồm comment trong ví dụ để giải thích điều gì đang xảy ra với mã.

Chú thích có thể hữu ích để mô tả ngắn gọn đoạn mã tiếp theo làm gì.

# tạo vector các số nguyên tố
primes <- c(2, 3, 5, 7, 11, 13)

# nhân các số nguyên tố với 2
primes * 2
#> [1]  4  6 10 14 22 26

Với các đoạn mã ngắn như thế này, việc để comment cho mọi dòng mã có thể không cần thiết. Nhưng khi mã bạn viết trở nên phức tạp hơn, comment có thể giúp bạn (và cộng sự) tiết kiệm rất nhiều thời gian tìm hiểu điều gì đã được thực hiện trong mã.

Sử dụng comment để giải thích tại sao của mã, không phải như thế nào hay cái gì. Cái gìnhư thế nào của mã luôn có thể tìm ra, dù có thể tẻ nhạt, bằng cách đọc kỹ nó. Nếu bạn mô tả mọi bước trong comment, rồi thay đổi mã, bạn sẽ phải nhớ cập nhật comment nữa, nếu không sẽ gây nhầm lẫn khi bạn quay lại mã trong tương lai.

Tìm hiểu tại sao điều gì đó được thực hiện khó hơn nhiều, nếu không muốn nói là không thể. Ví dụ, geom_smooth() có argument gọi là span, kiểm soát độ mượt của đường cong, với giá trị lớn hơn tạo đường cong mượt hơn. Giả sử bạn quyết định thay đổi giá trị span từ mặc định 0.75 thành 0.9: người đọc tương lai dễ dàng hiểu cái gì đang xảy ra, nhưng trừ khi bạn ghi lại suy nghĩ trong comment, không ai sẽ hiểu tại sao bạn thay đổi giá trị mặc định.

Với mã phân tích dữ liệu, sử dụng comment để giải thích kế hoạch tổng thể và ghi lại các phát hiện quan trọng khi bạn gặp chúng. Không có cách nào lấy lại kiến thức này chỉ từ mã nguồn.

2.3 Có gì trong một cái tên?

Tên đối tượng phải bắt đầu bằng một chữ cái và chỉ có thể chứa chữ cái, số, _, và .. Bạn muốn tên đối tượng mang tính mô tả, vì vậy bạn sẽ cần áp dụng một quy ước cho nhiều từ. Chúng tôi khuyến nghị snake_case, trong đó bạn phân cách các từ viết thường bằng _.

i_use_snake_case
otherPeopleUseCamelCase
some.people.use.periods
And_aFew.People_RENOUNCEconvention

Chúng ta sẽ quay lại theme đặt tên khi thảo luận về phong cách mã trong Chương 4.

Bạn có thể kiểm tra một đối tượng bằng cách gõ tên của nó:

x
#> [1] 12

Thực hiện một phép gán khác:

this_is_a_really_long_name <- 2.5

Để kiểm tra đối tượng này, hãy thử tính năng tự động hoàn thành của RStudio: gõ “this”, nhấn TAB, thêm ký tự cho đến khi bạn có tiền tố duy nhất, rồi nhấn return.

Giả sử bạn đã mắc lỗi, và giá trị của this_is_a_really_long_name nên là 3.5, không phải 2.5. Bạn có thể sử dụng phím tắt khác để sửa nó. Ví dụ, bạn có thể nhấn ↑ để hiển thị lệnh cuối cùng bạn đã gõ và chỉnh sửa nó. Hoặc, gõ “this” rồi nhấn Cmd/Ctrl + ↑ để liệt kê tất cả các lệnh bạn đã gõ bắt đầu bằng các chữ cái đó. Sử dụng phím mũi tên để điều hướng, rồi nhấn enter để gõ lại lệnh. Thay 2.5 thành 3.5 và chạy lại.

Thực hiện thêm một phép gán nữa:

r_rocks <- 2^3

Hãy thử kiểm tra nó:

r_rock
#> Error: object 'r_rock' not found
R_rocks
#> Error: object 'R_rocks' not found

Điều này minh họa hợp đồng ngầm giữa bạn và R: R sẽ thực hiện các phép tính tẻ nhạt cho bạn, nhưng đổi lại, bạn phải hoàn toàn chính xác trong các chỉ dẫn của mình. Nếu không, bạn có thể sẽ nhận được lỗi nói rằng đối tượng bạn đang tìm không được tìm thấy. Lỗi chính tả rất quan trọng; R không thể đọc suy nghĩ của bạn và nói, “ồ, họ có lẽ muốn nói r_rocks khi gõ r_rock”. Chữ hoa chữ thường rất quan trọng; tương tự, R không thể đọc suy nghĩ của bạn và nói, “ồ, họ có lẽ muốn nói r_rocks khi gõ R_rocks”.

2.4 Gọi hàm

R có một bộ sưu tập lớn các function tích hợp sẵn được gọi như thế này:

function_name(argument1 = value1, argument2 = value2, ...)

Hãy thử sử dụng seq(), tạo ra các dãy số đều đặn, và trong khi đó, học thêm các tính năng hữu ích của RStudio. Gõ se và nhấn TAB. Một cửa sổ bật lên hiển thị các gợi ý hoàn thành. Chỉ định seq() bằng cách gõ thêm (chữ q) để phân biệt hoặc bằng cách sử dụng mũi tên ↑/↓ để chọn. Chú ý tooltip nổi xuất hiện, nhắc bạn về các argument và mục đích của function. Nếu bạn muốn thêm trợ giúp, nhấn F1 để xem tất cả chi tiết trong tab trợ giúp ở bảng phải bên dưới.

Khi bạn đã chọn function mong muốn, nhấn TAB lần nữa. RStudio sẽ thêm cặp ngoặc mở (() và đóng ()) cho bạn. Gõ tên argument đầu tiên, from, và đặt bằng 1. Sau đó, gõ tên argument thứ hai, to, và đặt bằng 10. Cuối cùng, nhấn return.

seq(from = 1, to = 10)
#>  [1]  1  2  3  4  5  6  7  8  9 10

Chúng ta thường bỏ qua tên của các argument đầu tiên trong lệnh gọi function, vì vậy chúng ta có thể viết lại như sau:

seq(1, 10)
#>  [1]  1  2  3  4  5  6  7  8  9 10

Gõ đoạn mã sau và chú ý rằng RStudio cung cấp hỗ trợ tương tự với cặp dấu ngoặc kép:

x <- "hello world"

Dấu ngoặc kép và dấu ngoặc đơn luôn phải đi theo cặp. RStudio cố gắng hết sức để giúp bạn, nhưng vẫn có thể mắc lỗi và kết thúc với cặp không khớp. Nếu điều này xảy ra, R sẽ hiển thị ký tự tiếp tục “+”:

> x <- "hello
+

Dấu + cho bạn biết R đang chờ thêm đầu vào; nó nghĩ bạn chưa xong. Thông thường, điều này có nghĩa là bạn đã quên một " hoặc ). Hãy thêm cặp còn thiếu, hoặc nhấn ESCAPE để hủy biểu thức và thử lại.

Lưu ý rằng tab environment ở bảng phải phía trên hiển thị tất cả các đối tượng bạn đã tạo:

Tab Environment của RStudio hiển thị r_rocks, this_is_a_really_long_name, x, và y trong Global Environment.

2.5 Bài tập

  1. Tại sao đoạn mã này không chạy được?

    my_variable <- 10
    my_varıable
    #> Error:
    #> ! object 'my_varıable' not found

    Hãy nhìn kỹ! (Điều này có vẻ như là bài tập vô nghĩa, nhưng việc rèn luyện não bộ để nhận ra ngay cả sự khác biệt nhỏ nhất sẽ rất có ích khi lập trình.)

  2. Chỉnh sửa từng lệnh R sau đây để chúng chạy đúng:

    libary(todyverse)
    
    ggplot(dTA = mpg) +
      geom_point(maping = aes(x = displ y = hwy)) +
      geom_smooth(method = "lm)
  3. Nhấn Option + Shift + K / Alt + Shift + K. Điều gì xảy ra? Làm thế nào bạn có thể đến cùng vị trí đó bằng menu?

  4. Hãy xem lại bài tập từ Phần 1.6. Chạy các dòng mã sau. Biểu đồ nào trong hai biểu đồ được lưu thành mpg-plot.png? Tại sao?

    my_bar_plot <- ggplot(mpg, aes(x = class)) +
      geom_bar()
    my_scatter_plot <- ggplot(mpg, aes(x = cty, y = hwy)) +
      geom_point()
    ggsave(filename = "mpg-plot.png", plot = my_bar_plot)

2.6 Tóm tắt

Bây giờ bạn đã học thêm một chút về cách mã R hoạt động, và một số mẹo để giúp bạn hiểu mã khi quay lại trong tương lai. Trong chương tiếp theo, chúng tôi sẽ tiếp tục hành trình khoa học dữ liệu của bạn bằng cách dạy bạn về dplyr, package tidyverse giúp bạn biến đổi dữ liệu, dù là chọn biến quan trọng, lọc các row quan tâm, hay tính toán thống kê tóm tắt.