HocThuatSo.comHọc Thuật Số
Gửi thư
R cho nghiên cứu

Dự án RStudio và đường dẫn tương đối: thói quen đầu tiên nên có

Tạo dự án RStudio, xếp thư mục dữ liệu thô tách khỏi kết quả, dùng gói here thay cho setwd để mã R chạy được trên máy đồng nghiệp, máy hội đồng và chính máy mới của bạn.

Dự án RStudio và đường dẫn tương đối: thói quen đầu tiên nên có

Thói quen đầu tiên nên có khi học R cho nghiên cứu là mở mỗi đề tài thành một dự án RStudio riêng và gọi tệp bằng đường dẫn tương đối tính từ gốc dự án, qua gói here, thay vì dùng setwd() với đường dẫn tuyệt đối của máy mình.

Lý do rất đời thường. Đường dẫn kiểu C:/Users/Lan/Desktop/luan an/data.csv chỉ tồn tại trên đúng một máy. Gửi mã cho người hướng dẫn, đổi máy, đồng bộ qua ổ đám mây, hay nộp kèm bài báo cho tạp chí yêu cầu chia sẻ mã: dòng đầu tiên đã hỏng. Dự án RStudio giải quyết chuyện đó bằng một quy ước đơn giản: mọi thứ của đề tài nằm trong một thư mục, và mã chỉ nói chuyện với thư mục ấy.

Tạo dự án RStudio mới mất bao lâu?

Chưa tới một phút. Trong RStudio, làm theo thứ tự:

  1. Vào File → New Project…, chọn New Directory rồi New Project.
  2. Đặt tên thư mục không dấu, không khoảng trắng, ví dụ khao-sat-giang-vien. Tên có dấu và dấu cách không làm R hỏng ngay, nhưng hay gây lỗi khi chuyển sang dòng lệnh, Git hoặc máy chủ.
  3. Chọn nơi đặt thư mục. Tránh đặt sâu trong thư mục đồng bộ đang chạy liên tục nếu dự án có tệp dữ liệu lớn hay thay đổi.
  4. Nếu đã quen Git, đánh dấu Create a git repository. Nếu muốn ghi lại phiên bản gói ngay từ đầu, đánh dấu Use renv with this project.
  5. Bấm Create Project. RStudio mở một phiên R mới với thư mục làm việc chính là thư mục dự án và tạo tệp khao-sat-giang-vien.Rproj.

Từ nay, muốn làm đề tài này thì bấm đúp vào tệp .Rproj hoặc chọn dự án ở góc trên bên phải RStudio. Mỗi đề tài một phiên R sạch, không lẫn biến của đề tài khác.

Nên xếp thư mục trong dự án thế nào?

Không có chuẩn bắt buộc, nhưng một cấu trúc ổn định giúp bạn và người khác đoán được tệp nằm đâu. Mẫu dưới đây đủ cho phần lớn luận văn và bài báo:

Thư mụcChứa gìQuy tắc
du-lieu/tho/Tệp gốc nhận được: xuất từ phần mềm khảo sát, SPSS, ExcelChỉ đọc, không bao giờ ghi đè
du-lieu/xu-ly/Dữ liệu đã làm sạch, thường lưu dạng .rdsLuôn tạo lại được từ mã
R/Kịch bản đánh số: 01-lam-sach.R, 02-mo-ta.R, 03-hoi-quy.RChạy theo thứ tự số
ket-qua/hinh/, ket-qua/bang/Hình và bảng xuất raXoá đi rồi chạy lại vẫn ra y hệt
bao-cao/Tệp Quarto hoặc R Markdown, bản thảoĐọc kết quả, không tự tính lại
tai-lieu/Bảng mã biến, phiếu hỏi, ghi chúCập nhật khi đổi mã biến

Nguyên tắc quan trọng nhất là tách dữ liệu thô khỏi mọi thứ khác. Khi dữ liệu thô không bị đụng vào, mọi sai sót trong khâu làm sạch đều sửa được bằng cách sửa mã rồi chạy lại.

Gói here thay setwd như thế nào?

Cài và gọi tệp

Cài một lần bằng install.packages('here'). Trong kịch bản, thay vì read.csv('C:/.../khaosat.csv'), viết read.csv(here::here('du-lieu', 'tho', 'khaosat.csv')). Hàm here() tìm gốc dự án bằng cách đi ngược lên các thư mục cha cho tới khi gặp dấu hiệu như tệp .Rproj, tệp .here hoặc thư mục .git, rồi ghép phần còn lại vào.

Vì sao không dùng đường dẫn tương đối trần

Viết read.csv('du-lieu/tho/khaosat.csv') cũng chạy, miễn thư mục làm việc đúng là gốc dự án. Rắc rối nảy sinh khi tệp Quarto nằm trong bao-cao/: lúc biên dịch, thư mục làm việc mặc định là thư mục chứa tệp đó, nên đường dẫn trần trỏ sai. here() luôn tính từ gốc nên không bị ảnh hưởng.

Khai báo vị trí kịch bản

Đặt here::i_am('R/01-lam-sach.R') ở đầu mỗi kịch bản. Dòng này báo cho here biết tệp đang nằm đâu trong dự án; nếu ai đó chạy kịch bản từ chỗ khác, R báo lỗi rõ ràng ngay đầu thay vì đọc nhầm một tệp cùng tên.

Đặt tên tệp và chia kịch bản thế nào cho người khác đọc được?

Đánh số theo thứ tự chạy

Tên kịch bản bắt đầu bằng số hai chữ số và một động từ ngắn: 01-nhap.R, 02-lam-sach.R, 03-mo-ta.R, 04-hoi-quy.R. Người mở thư mục lần đầu biết ngay phải chạy tệp nào trước. Khi chen một bước vào giữa, đặt 02b-... thay vì đánh số lại toàn bộ.

Mỗi kịch bản đọc một đầu vào, ghi một đầu ra

Kịch bản làm sạch đọc từ du-lieu/tho/ và ghi du-lieu/xu-ly/khaosat-sach.rds. Kịch bản phân tích chỉ đọc tệp .rds đó. Như vậy muốn chạy lại phần hồi quy, bạn không phải chạy lại phần nhập dữ liệu mất vài phút, và khi số liệu đổi, bạn biết chính xác bước nào tạo ra nó.

Một tệp hướng dẫn ở gốc

Đặt tệp README.md ở gốc dự án, ghi vài dòng: đề tài là gì, dữ liệu lấy từ đâu và ai được dùng, thứ tự chạy kịch bản, phiên bản R đã dùng. Năm dòng là đủ; người hướng dẫn, đồng tác giả hay chính bạn sau một năm sẽ cần đúng mấy dòng đó.

Báo cáo không tự tính lại

Tệp Quarto hoặc R Markdown trong bao-cao/ nên đọc bảng và hình đã xuất, hoặc đọc tệp .rds kết quả, thay vì chép lại toàn bộ phần làm sạch. Báo cáo biên dịch nhanh, và không có hai bản mã làm sạch song song dễ lệch nhau.

Ba cài đặt RStudio nên đổi ngay

Không khôi phục .RData khi mở. Vào Tools → Global Options → General, bỏ chọn Restore .RData into workspace at startup. Nếu để mặc định, biến cũ từ phiên trước quay lại, mã có thể chạy được chỉ vì một đối tượng tạo bằng tay từ tuần trước vẫn còn trong bộ nhớ.

Không lưu không gian làm việc khi thoát. Cùng trang đó, đặt Save workspace to .RData on exit thành Never. Kết quả nằm trong mã và trong tệp xuất ra, không nằm trong bộ nhớ.

Khởi động lại R thường xuyên. Dùng Session → Restart R rồi chạy lại kịch bản từ đầu. rm(list = ls()) không thay được việc này vì nó không gỡ gói đã nạp và không trả lại các tuỳ chọn đã đổi.

renv giữ phiên bản gói cho dự án ra sao?

Đường dẫn đúng mới giải quyết một nửa. Nửa còn lại là phiên bản gói: một hàm đổi tham số mặc định giữa hai bản là đủ để kết quả lệch. Gói renv tạo một thư viện gói riêng cho dự án và ghi danh sách gói cùng phiên bản vào tệp renv.lock.

Cách dùng gọn: renv::init() một lần khi bắt đầu; mỗi khi cài thêm hay cập nhật gói và thấy mã vẫn chạy đúng, gọi renv::snapshot(); người nhận dự án mở tệp .Rproj rồi gọi renv::restore() để cài đúng các bản đó. Gửi kèm renv.lock, không cần gửi thư mục thư viện.

Một giới hạn cần biết: renv ghi phiên bản gói, không ghi phiên bản R hay thư viện hệ thống. Ghi phiên bản R vào tệp hướng dẫn của dự án, hoặc in sessionInfo() ra cuối báo cáo.

Lỗi hay gặp và việc nên làm ngay hôm nay

Một tình huống điển hình: học viên gửi thư mục cho người hướng dẫn, người hướng dẫn mở kịch bản và gặp ngay lỗi không mở được tệp vì dòng đầu là setwd() trỏ tới ổ D của máy học viên. Phần lớn rắc rối thuộc vài dạng quen:

  • Mở tệp .R bằng cách bấm đúp thay vì mở dự án: thư mục làm việc rơi về thư mục người dùng, mọi đường dẫn tương đối hỏng.
  • Lồng dự án trong dự án: here() có thể chọn gốc ở tầng không mong muốn. Mỗi đề tài một thư mục ngang hàng.
  • Đặt dữ liệu nhạy cảm trong thư mục dự án đang đẩy lên kho mã công khai: thêm du-lieu/ vào .gitignore trước lần đẩy đầu tiên.
  • Ghi đè tệp thô sau khi sửa tay trong Excel: sửa trong mã, ghi ra du-lieu/xu-ly/.
  • Việc KHÔNG cần làm: sắp lại mọi đề tài cũ. Chỉ áp dụng cho đề tài đang chạy và đề tài mới.

Bài kiểm tra đơn giản nhất: nén thư mục dự án (không kèm dữ liệu nhạy cảm), giải nén sang một chỗ khác trên máy, mở tệp .Rproj, khởi động lại R và chạy lần lượt các kịch bản. Chạy hết không lỗi là dự án đã đi được sang máy người khác.

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

Dùng Positron hoặc VS Code thay RStudio thì gói here còn dùng được không?

Vẫn dùng được. Mở cả thư mục đề tài làm không gian làm việc; here tìm gốc qua tệp .Rproj, tệp .here hoặc thư mục .git, không phụ thuộc vào RStudio. Có thể tạo tệp .here bằng here::set_here().

Có nên đặt dự án trong thư mục đồng bộ đám mây không?

Được, nhưng nên tránh đồng bộ thư mục thư viện của renv và các tệp tạm lớn. Nếu dữ liệu có thông tin cá nhân, kiểm tra quy định của trường về nơi lưu trước khi đặt lên dịch vụ đám mây.

Khi nào setwd vẫn chấp nhận được?

Khi gõ thử trong bảng điều khiển để xem nhanh một tệp, không lưu vào kịch bản. Trong mã nộp kèm luận văn hay bài báo, không nên có setwd.

Một dự án có thể chứa nhiều bài báo không?

Có thể, nếu các bài dùng chung một bộ dữ liệu và mã làm sạch. Khi phần phân tích tách hẳn nhau, tách thành dự án riêng sẽ dễ gửi và dễ kiểm hơn.

Tệp renv.lock có cần đưa lên kho mã không?

Cần. Đó là tệp giúp người khác cài đúng phiên bản gói. Thư mục renv/library thì không cần đưa lên vì có thể cài lại từ tệp khoá.

Tên biến và tên tệp có nên viết tiếng Việt có dấu không?

Tên tệp, thư mục và tên biến nên không dấu, không khoảng trắng. Nhãn hiển thị trên hình và bảng thì cứ viết tiếng Việt đầy đủ dấu.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

🧭
Bạn đang ở chặng nào của đường học vị?
Nhập chỗ bạn đang đứng và đích bạn nhắm — công cụ trả về số năm, chi phí và việc phải làm từng chặng.
Xem lộ trình của tôi →
Miễn phí, không cần tài khoản. Xem tất cả công cụ

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.

hoặc
[email protected]