Chuyển đến nội dung chính
R

Sử dụng hệ thống chấm điểm tự động của DataCamp để dạy R

Tìm hiểu cách hệ thống chấm điểm tự động của DataCamp hỗ trợ việc dạy R, và cách vận dụng các hàm của testwhat.
Filip Schouwenaars's photo
Filip Schouwenaars
Đã cập nhật · 6 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Tạo tài khoản miễn phí của bạn

Luyện tập và Lộ trình tiến trình của bạn.

Tiếp Tục Với Google
Bằng cách tiếp tục, bạn chấp nhận Điều khoản sử dụng, Chính sách bảo mật và việc dữ liệu của bạn được lưu trữ tại Hoa Kỳ.

Phản hồi tức thì và cá nhân hóa luôn là trọng tâm của trải nghiệm học tập trên DataCamp kể từ khi chúng tôi ra mắt những khóa học đầu tiên. Nếu học viên gửi đoạn mã có lỗi, họ sẽ được chỉ ra lỗi ở đâu và cách khắc phục như thế nào. Bạn có thể thử trong khóa học Giới thiệu R miễn phí của chúng tôi. Ảnh chụp màn hình bên dưới là từ khóa học R Trung cấp.

Để kiểm tra bài nộp và tạo phản hồi, mỗi bài tập trên DataCamp đều có một Bài kiểm tra độ chính xác của bài nộp, gọi tắt là SCT.

SCT là một tập lệnh gồm các kiểm thử tùy chỉnh dùng để đánh giá đoạn mã học viên gửi lên, cùng với đầu ra và các biến mà họ tạo ra từ đoạn mã đó. Với mỗi ngôn ngữ được giảng dạy trên DataCamp, chúng tôi đều xây dựng một gói mã nguồn mở tương ứng để dễ dàng xác thực tất cả các thành phần trong bài nộp của học viên. Đối với bài tập R, gói này có tên là testwhat. Qua nhiều năm, chúng tôi đã bổ sung rất nhiều hàm để:

  • kiểm tra việc gán biến
  • kiểm tra lời gọi hàm và kết quả của lời gọi hàm
  • kiểm tra câu lệnh if, vòng lặp for và vòng lặp while
  • kiểm tra định nghĩa hàm
  • kiểm tra xem các gói cần thiết đã được nạp chưa
  • kiểm tra đầu ra mà học viên tạo ra
  • kiểm tra các lời gọi vẽ đồ thị ggplot và ggvis
  • ...

Khi các hàm kiểm tra này phát hiện lỗi, chúng sẽ tự động tạo ra thông điệp phản hồi có ý nghĩa để chỉ cho học viên thấy lỗi của mình. Bạn cũng có thể chỉ định thông điệp phản hồi tùy chỉnh để ghi đè các thông điệp tự động này.

Trước đây, testwhat gắn chặt với hệ thống backend độc quyền của chúng tôi dùng để thực thi mã R trên máy chủ DataCamp. Dù testwhat luôn là mã nguồn mở, nhưng nếu thiếu backend tùy chỉnh này, testwhat hoạt động không hiệu quả và chỉ có thể dùng trong ngữ cảnh của DataCamp. Tuy nhiên ngày nay, testwhat có thể được sử dụng độc lập và hỗ trợ các trường hợp dùng khác. Bạn có thể tận dụng mọi tính năng của testwhat để kiểm tra bài nộp của học viên, ngay cả khi hình thức giảng dạy của bạn rất khác so với DataCamp. Bạn có thể cài đặt gói từ GitHub:

library(remotes) # devtools works fine too
install_github('datacamp/testwhat')

Ví dụ nhanh: giả sử bạn yêu cầu học viên tạo một biến x bằng 5. Dạng chuỗi của lời giải lý tưởng sẽ như sau:

solution_code <- 'x <- 5'

Giờ giả sử học viên nộp một script trong đó x bị đặt sai thành một vector gồm hai giá trị, có thể viết như sau:

student_code <- 'x <- c(4, 5)'

testwhat cung cấp hàm setup_state() để thực thi bài nộp của học viên và script lời giải trong các môi trường tách biệt, đồng thời ghi nhận đầu ra và lỗi do mã của học viên tạo ra. Tất cả thông tin này được lưu trong trạng thái bài tập và bạn có thể truy cập bằng ex():

library(testwhat)
setup_state(stu_code = student_code,
            sol_code = solution_code)
ex()
## <RootState>

Trạng thái bài tập này có thể được truyền vào nhiều hàm kiểm tra mà testwhat cung cấp, sử dụng cú pháp pipe của magrittr. Để kiểm tra xem học viên có định nghĩa biến x hay chưa, bạn có thể dùng check_object():

ex() %>% check_object('x')
## <ObjectState>

Đoạn mã này chạy ổn, vì học viên thực sự đã định nghĩa biến x. Để tiếp tục kiểm tra xem học viên định nghĩa biến x có đúng hay không, bạn có thể dùng check_equal():

ex() %>% check_object('x') %>% check_equal()
## Error in check_that(is_equal(student_obj, solution_obj, eq_condition), : The contents of the variable `x` aren't correct. It has length 2, while it should have length 1.

Lỗi xuất hiện. check_equal() phát hiện giá trị của x trong môi trường của học viên (một vector) không khớp với giá trị của x trong môi trường lời giải (một số đơn). Lưu ý cách thông điệp lỗi cung cấp mô tả dễ hiểu về sai sót này.

Ví dụ trên mang tính tương tác: bạn thiết lập trạng thái, rồi gõ tiếp chuỗi các hàm kiểm tra. Ở mức cao hơn, bạn có thể dùng run_until_fail() để bao quanh mã kiểm tra. Hàm này sẽ chạy bộ kiểm thử cho đến khi có lỗi:

library(testwhat)
setup_state(stu_code = 'x <- 4',
            sol_code = 'x <- 5')
res <- run_until_fail({
  ex() %>% check_object('x') %>% check_equal()
})
res$correct
## [1] FALSE
res$message
## [1] "The contents of the variable `x` aren't correct."

Phương pháp cơ bản này — xây dựng trạng thái bài tập với bài nộp của học viên và lời giải, rồi dùng run_until_fail() để chạy một bộ kiểm thử — có thể dễ dàng tích hợp vào quy trình chấm điểm tự động phù hợp với nhu cầu của bạn. Giả sử học viên đã nộp bài dưới dạng script R mà bạn đã tải về máy tính trong thư mục submissions (chúng tôi đã điền sẵn một số dữ liệu ngẫu nhiên). Có một loạt script R trong thư mục submissions. Mỗi script R chứa một bài nộp của học viên:

dir('submissions')
##  [1] "student_a.R" "student_b.R" "student_c.R" "student_d.R" "student_e.R"
##  [6] "student_f.R" "student_g.R" "student_h.R" "student_i.R" "student_j.R"
readLines('submissions/student_a.R')
## [1] "x <- 4"
readLines('submissions/student_b.R')
## [1] "x <- 5"

Giờ chúng ta có thể lặp qua tất cả các bài nộp này và tạo một data.frame cho biết bài nộp của từng học viên là đúng hay không:

library(testwhat)

folder_name <- 'submissions'
all_files <- file.path(folder_name, dir(folder_name))
student_results <- sapply(all_files, function(file) {
  student_code <- readLines(file)
  setup_state(sol_code = 'x <- 5',
              stu_code = student_code)
  res <- run_until_fail({
    ex() %>% check_object('x') %>% check_equal()
  })
  res$correct
})
results_df <- data.frame(name = all_files, correct = student_results,
                         row.names = NULL, stringsAsFactors = FALSE)
results_df
##                       name correct
## 1  submissions/student_a.R   FALSE
## 2  submissions/student_b.R    TRUE
## 3  submissions/student_c.R    TRUE
## 4  submissions/student_d.R    TRUE
## 5  submissions/student_e.R   FALSE
## 6  submissions/student_f.R    TRUE
## 7  submissions/student_g.R   FALSE
## 8  submissions/student_h.R   FALSE
## 9  submissions/student_i.R    TRUE
## 10 submissions/student_j.R    TRUE

Bản demo nhỏ này vẫn còn hơi thô, nhưng hy vọng đã truyền tải được ý chính: với một chút thao tác trong R để xây dựng đầu vào phù hợp cho setup_state(), bạn có thể vận dụng toàn bộ các hàm kiểm tra của testwhat. Những kiểm thử bạn chỉ định trong run_until_fail() vừa xác minh bài làm của học viên, vừa tạo phản hồi hữu ích để chỉ ra những lỗi họ đang mắc phải.

Để tìm hiểu thêm về testwhat, bạn có thể truy cập kho GitHub hoặc tài liệu của gói, được tạo bằng pkgdown. Tài liệu bao gồm cả các bài viết hướng dẫn cách dùng một số hàm kiểm tra nhất định, cũng như tài liệu tham chiếu mô tả mọi tham số bạn có thể chỉ định. Đừng ngần ngại tạo issue trên GitHub hoặc liên hệ qua content-engineering@datacamp.com, chúng tôi luôn hoan nghênh phản hồi! Chúc bạn dạy học hiệu quả!

Bài blog này được tạo bằng RMarkdown. Bạn có thể xem mã nguồn tại đây.

Chủ đề
R
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem thêm