तुरंत और व्यक्तिगत फीडबैक, DataCamp पर सीखने के अनुभव का एक अहम हिस्सा रहा है, जब से हमने पहली बार पाठ्यक्रम शुरू किए। यदि छात्र ऐसा कोड सबमिट करते हैं जिसमें कोई गलती है, तो उन्हें बताया जाता है कि गलती कहाँ हुई और उसे कैसे ठीक किया जा सकता है। आप हमारे नि:शुल्क Introduction to R कोर्स में इसे आज़मा सकते हैं। नीचे दिया गया स्क्रीनशॉट हमारे Intermediate R कोर्स से है।

सबमिशन जाँचने और फीडबैक जनरेट करने के लिए, DataCamp के हर अभ्यास में Submission Correctness Test, या SCT होता है।
SCT कस्टम टेस्ट्स का एक स्क्रिप्ट होता है जो छात्रों द्वारा सबमिट किए गए कोड और उस कोड से बने आउटपुट तथा वेरिएबल्स का आकलन करता है। DataCamp पर हम जिस भी भाषा को सिखाते हैं, उसके लिए हमने एक संबंधित ओपन-सोर्स पैकेज बनाया है ताकि छात्र के सबमिशन के इन सभी तत्वों को आसानी से वेरिफाई किया जा सके। R अभ्यासों के लिए, इस पैकेज का नाम testwhat है। वर्षों में, हमने बहुत-सी फ़ंक्शंस जोड़ी हैं ताकि:
- वेरिएबल असाइनमेंट की जाँच की जा सके
- फ़ंक्शन कॉल और उनके परिणामों की जाँच की जा सके
- if स्टेटमेंट्स, for लूप्स, और while लूप्स की जाँच की जा सके
- फ़ंक्शन डेफ़िनिशन की जाँच की जा सके
- यह जाँचा जा सके कि सही पैकेज लोड हुए हैं या नहीं
- छात्र द्वारा जनरेट किए गए आउटपुट की जाँच की जा सके
- ggplot और ggvis प्लॉटिंग कॉल्स की जाँच की जा सके
- ...
जब ये जाँचने वाले फ़ंक्शंस कोई गलती पकड़ते हैं, तो वे अपने-आप एक अर्थपूर्ण फीडबैक संदेश बनाते हैं जो छात्रों को उनकी गलती की ओर इंगित करता है। आप कस्टम फीडबैक संदेश भी तय कर सकते हैं जो स्वतः जनरेट हुए संदेशों को ओवरराइड करते हैं।
ऐतिहासिक रूप से, testwhat हमारा स्वामित्व वाला बैकएंड, जो DataCamp के सर्वरों पर R कोड चलाता है, उससे काफ़ी जुड़ा हुआ था। यद्यपि testwhat हमेशा से ओपन सोर्स रहा है, यह उस कस्टम बैकएंड के बिना ठीक से काम नहीं करता था और केवल DataCamp के संदर्भ में ही इस्तेमाल किया जा सकता था। आज, हालांकि, testwhat स्वतंत्र रूप से उपयोग किया जा सकता है और अन्य उपयोग के मामलों का भी समर्थन करता है। आप testwhat की सभी क्षमताओं का लाभ उठाकर छात्र सबमिशन का परीक्षण कर सकते हैं, भले ही आपका शिक्षण फ़ॉर्मेट DataCamp से अलग हो। आप GitHub से पैकेज इंस्टॉल कर सकते हैं:
library(remotes) # devtools works fine too
install_github('datacamp/testwhat')
एक त्वरित डेमो के तौर पर मान लें कि आप छात्रों से वेरिएबल x को 5 के बराबर बनाने के लिए कहते हैं। आदर्श समाधान का स्ट्रिंग वर्ज़न कुछ इस तरह होगा:
solution_code <- 'x <- 5'
अब मान लें कि छात्र ने ऐसा स्क्रिप्ट सबमिट किया है जिसमें x को ग़लत तरीके से दो मानों के वेक्टर के रूप में सेट किया गया है, जिसे इस तरह कोड किया जा सकता है:
student_code <- 'x <- c(4, 5)'
testwhat में setup_state() नाम का एक फ़ंक्शन है जो छात्र का सबमिशन और समाधान स्क्रिप्ट को अलग-अलग एनवायरनमेंट्स में चलाता है और छात्र के कोड द्वारा जनरेट किए गए आउटपुट और त्रुटियों को कैप्चर करता है। यह सारी जानकारी तथाकथित exercise state में संग्रहीत होती है, जिसे आप ex() से एक्सेस कर सकते हैं:
library(testwhat)
setup_state(stu_code = student_code,
sol_code = solution_code)
ex()
## <RootState>
इस exercise state को आप testwhat की विस्तृत जाँच फ़ंक्शंस की श्रेणी को magrittr की पाइपिंग सिंटैक्स के साथ पास कर सकते हैं। यह जाँचने के लिए कि छात्र ने वेरिएबल x परिभाषित किया है या नहीं, आप check_object() का उपयोग कर सकते हैं:
ex() %>% check_object('x')
## <ObjectState>
यह कोड ठीक चलता है, क्योंकि छात्र ने वास्तव में वेरिएबल x परिभाषित किया है। आगे बढ़ते हुए और यह जाँचने के लिए कि छात्र ने वेरिएबल x को सही ढंग से परिभाषित किया है या नहीं, आप 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.
यहाँ त्रुटि आती है। check_equal() यह पहचानता है कि छात्र के एनवायरनमेंट में x का मान (एक वेक्टर) समाधान वाले एनवायरनमेंट में x के मान (एक एकल संख्या) से मेल नहीं खाता। ध्यान दें कि त्रुटि संदेश में इस गलती का विवरण एक मानवीय, पठनीय रूप में दिया गया है।
ऊपर का उदाहरण इंटरैक्टिव था: आप एक state बनाते हैं और फिर जाँच फ़ंक्शंस की चेन टाइप करते जाते हैं। एक उच्चतर स्तर पर, आप जाँचने वाले कोड को रैप करने के लिए run_until_fail() का उपयोग कर सकते हैं। यह आपके टेस्ट्स के समूह को तब तक चलाएगा जब तक कोई जाँच असफल नहीं हो जाती:
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."
यह बुनियादी तरीका, जिसमें छात्र का सबमिशन और समाधान के साथ एक exercise state बनती है और फिर run_until_fail() का उपयोग कर टेस्ट्स का समूह चलाया जाता है, आसानी से किसी भी ऐसे ऑटोग्रेडिंग वर्कफ़्लो में समाहित किया जा सकता है जो आपकी ज़रूरतों के अनुरूप हो। मान लें आपके छात्रों ने अपने असाइनमेंट R स्क्रिप्ट के रूप में सबमिट किए हैं जिन्हें आपने अपने कंप्यूटर पर submissions नामक फ़ोल्डर में डाउनलोड किया है (हमने इस फ़ोल्डर को कुछ यादृच्छिक डेटा से पहले से भर रखा है)। हमारे पास submissions फ़ोल्डर में कई R स्क्रिप्ट्स हैं। हर R स्क्रिप्ट में एक छात्र का सबमिशन है:
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"
अब हम इन सभी सबमिशनों पर क्रमवार चल सकते हैं और एक data.frame बना सकते हैं जो प्रति छात्र यह बताता है कि सबमिशन सही था या नहीं:
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
यह छोटा-सा डेमो अभी थोड़ा कच्चा है, पर आशा है कि बात स्पष्ट हो गई होगी: setup_state() के लिए उपयुक्त इनपुट बनाने के लिए कुछ R के साथ काम करके, आप testwhat की सभी जाँचने वाली फ़ंक्शंस को उपयोग में ला सकते हैं। run_until_fail() में जो टेस्ट्स आप तय करते हैं, वे न केवल छात्रों के कार्य को वेरिफाई करेंगे बल्कि उन्हें उनकी गलतियों की ओर इंगित करते हुए अर्थपूर्ण फीडबैक भी जनरेट करेंगे।
testwhat के बारे में और जानने के लिए आप GitHub रेपो या पैकेज डॉक्यूमेंटेशन देखें, जो pkgdown से जनरेट किया गया है। इसमें ऐसे विज़्नेट्स हैं जो बताते हैं कि कुछ जाँच फ़ंक्शंस का उपयोग कैसे करें, साथ ही एक रेफ़रेंस फ़ंक्शन भी है जो सभी आर्ग्युमेंट्स का विवरण देता है जिन्हें आप निर्दिष्ट कर सकते हैं। GitHub पर इश्यू उठाने में या content-engineering@datacamp.com पर हमसे संपर्क करने में संकोच न करें, हमें फीडबैक पसंद है! पढ़ाने के लिए शुभकामनाएँ!
यह ब्लॉग RMarkdown से जनरेट किया गया है। आप स्रोत कोड यहाँ पा सकते हैं।