Menu
CoddyTech

Làm việc với tệp

Thuộc phần Lập trình hướng đối tượng trong hành trình R của Coddy. Bài học 1 trên 57.

Các chương trình thực tế được chia thành nhiều tệp. Trong R, source("Greeting.R") chạy một tệp khác từ đầu đến cuối, rồi bạn có thể dùng mọi hàm được định nghĩa trong tệp đó:

# Greeting.R
greeting <- function(name) {
  paste0("Hello, ", name, "!")
}

# main.R
source("Greeting.R")
cat(greeting("Ada"), "\n")

Chạy main.R sẽ in ra Hello, Ada!: dòng source() tải greeting() trước khi main.R gọi hàm này.

Chương trình bắt đầu trong tệp bạn chạy, ở đây là main.R, và R đọc tệp đó từng dòng một. Thứ tự rất quan trọng: hàm chỉ tồn tại sau khi tệp định nghĩa hàm đó được nạp, vì vậy các dòng source() nằm ở đầu tệp:

# main.R
cat(greeting("Ada"), "\n")   # Lỗi: không tìm thấy hàm (function) "greeting"
source("Greeting.R")
cat(greeting("Ada"), "\n")   # Chạy được: greeting() giờ đã tồn tại

Bố cục thường dùng là mỗi tệp chứa một lớp và được đặt tên theo lớp đó: Account.R chứa hàm khởi tạo account và các phương thức của nó, Shape.R chứa các hàm tổng quát shape. Trong các thử thách của phần này, bạn viết code vào những tệp đó, còn main.R chứa code đầu vào/đầu ra đã được cung cấp, với các dòng source() đã nằm ở đầu tệp theo đúng thứ tự. Trình chỉnh sửa hiển thị mỗi tệp dưới dạng một thẻ.

Shape.R      # Các hàm tổng quát dùng chung cho mọi hình: nạp tệp này trước
Circle.R     # Lớp hình tròn và các phương thức của lớp
main.R       # source("Shape.R"); source("Circle.R"); đọc đầu vào, in ra kết quả

source() chạy một tệp trong môi trường toàn cục, vì vậy các hàm và biến trong đó trở thành tên toàn cục. R không có tên riêng tư theo tệp: nếu hai tệp định nghĩa helper(), tệp được source sau cùng sẽ thắng. Một giá trị nằm riêng trên một dòng trong tệp được source cũng không được in ra, vì vậy các tệp cần hiển thị nội dung nào đó sẽ gọi cat():

# Tools.R
total <- 0                 # biến toàn cục sau khi nạp tệp
42                         # source() không in ra
helper <- function(x) x * 2

# Other.R
helper <- function(x) x + 1   # nạp tệp sau: thay thế helper ở trên
challenge icon

Thử thách

Dễ

Chương trình có hai tệp. main.R nạp Greeting.R, đọc tên và in ra kết quả của greeting(name) cho từng tên. Hoàn thiện greeting() trong Greeting.R để hàm trả về Hello, Ada! cho tên Ada, hoặc Hello, friend! khi tên trống.

Đặt code của bạn trong Greeting.R. main.R chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.

Tự làm thử

source("Greeting.R")

# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
for (name in input) cat(greeting(name), "\n", sep = "")
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch R online