grade_code()
no longer fails if .envir_result
or .envir_solution
is missing (#355).detect_mistakes()
now keeps a version of standardized user and solution code with and without default arguments added. Missing arguments are detected by comparing the user code with defaults to the solution code without defaults. Surplus arguments are detected by comparing the user code without defaults to the solution code with defaults (#356).gradethis_equal.list()
method is now only used if both x
and y
are bare lists (as defined by rlang::is_bare_list()
) (#357).list(a = 1, b = 2)
and c(a = 1, b = 2)
or data.frame(a = 1, b = 2)
.call_standardise_formals()
would fail when given a purrr::map()
function where .f
is an index rather than a function (#359).code_feedback()
now standardizes arguments to functions defined within student and solution code before comparing code. It also now successfully standardizes arguments passed through ...
by mapping functions into functions defined by setup code (#349).gradethis_equal()
now has a method for objects of class list
. If two lists are not identical()
and their lengths are the same, gradethis_equal()
is applied to each element pairwise. This allows special logic for specific classes to be used for list elements of that class (#351).call_standardise_formals()
now applies ggplot2::standardise_aes_names()
to all arguments of ggplot2
functions. This means it no longer detects inconsequential differences between, e.g., color =
and colour =
(#353).-error-check
chunk returns an error, the default feedback now includes both the error message and code feedback if fail.hint = TRUE
. Previously the error message was only shown when fail.hint = FALSE
and code feedback was only shown when fail.hint = TRUE
(#352).gradethis_equal()
now has default arguments of x = .result
and y = .solution
(#347).gradethis_equal.default()
now has a default argument of tolerance = sqrt(.Machine$double.eps)
.fail_if_not_equal()
(#346).pass_if_equal()
, fail_if_equal()
, and fail_if_not_equal()
now call gradethis_equal()
, an S3 generic which calls waldo::compare()
by default. This allows other methods for gradethis_equal()
to handle special cases (#346).call_standardise_formals()
now attempts to standardize arguments passed through ...
in mapping functions like lapply()
or purrr::map()
(#344).call_standardise_formals()
now attempts to standardize the arguments of calls to S3 generics (#339).pass_if()
and fail_if()
now produce more informative error messages if their cond
argument is invalid (#341).user_object_get()
, user_object_exists()
and user_object_list()
can be used to interact with objects created by the student's code. solution_object_get()
, solution_object_exists()
and solution_object_list()
do the same for objects created by the solution code (#333).with_exercise()
allows you to evaluate an expression as if it were run inside grade_this()
with an associated exercise. It can be used alongside mock_this_exercise()
for testing grading code outside the context of a learnr tutorial (#333)..envir_solution
is now included in the grade_this()
check environment alongside .envir_prep
and .envir_result
. .envir_solution
contains the state of the environment used to execute solution code, just as .envir_result
does for student code (#333).code_feedback()
now supports multiple solutions. By default, code_feedback()
now looks for .solution_code_all
. If multiple solutions are present, string distance is used to determine the closest solution to .user_code
and give feedback based on that solution. Functions that call code_feedback()
internally (grade_this_code()
, fail_if_code_feedback()
and maybe_code_feedback()
) inherit the same functionality (#289).solution_code
argument of code_feedback()
is now the single entry-point for solution code in code_feedback()
, fail_if_code_feedback()
and other functions that work with both .solution_code
and .solution_code_all
. In these cases, the default argument values will use multiple solutions if they exist (#305).pass_if_equal()
supports multiple solutions when authors set y = .solution_all
to compare the student's result with all solutions. For additional details, please see the new section, Comparing with Multiple Solutions, in ?pass_if_equal
(#306).vignette("multiple_solutions")
describes how gradethis can be used to provide feedback for exercises with more than one solution (#312).gradethis_error_checker()
gains the hint
argument from fail()
which follows the global gradethis.fail.hint
option. When FALSE
, the error feedback won't include code feedback hints (thanks @cswclui, #315).gradethis_exercise_checker()
can now be configure to evaluate solution code for non-R exercise engines by providing a function of code
and envir
to the solution_eval_fn
argument. In addition to evaluation R exercise solutions, gradethis will now also evaluate SQL exercise solutions (#316)..solution_all
object in grade_this()
grading code. pass_if_equal()
gains support for multiple solutions as its y
argument. If .solution_all
is used as the y
argument of pass_if_equal()
, it will return a passing grade if x
matches any of the multiple solutions (#296).return()
in grade_this()
grading code to exit grading early. This is allowed in code and error checking code, but will result in an "internal error" when used in the -check
chunk grading code (#284).-solution
chunk, separated by code section headers, e.g. # ----
. (note only trailing dashes, ----
, are supported). These additional solutions are made available in the .solution_code_all
object in grade_this()
grading code and are named with the code section name if one is provided, e.g. # first ----
. When multiple solutions are provided using the code section comments, .solution
and .solution_code
will default to the last solution. (#286)grade_this_code()
and fail_if_code_feedback()
now return informative feedback with a neutral grade when no code is submitted and when not previously caught by learnr (#288).pass_if_equal()
and fail_if_equal()
gain a tolerance argument which is passed to waldo::compare()
. This defaults to the same default value as all.equal()
to avoid floating point errors when comparing numeric values (#295).grade_this_code()
gains an action
argument, allowing authors to choose if grade_this_code()
should only "pass"
or "fail"
the user's submission. By default, grade_this_code()
uses action = "both"
to maintain current behavior. (#276)"check"
stage. (#276)gradethis_setup()
: grading_problem.message
and grading_problem.type
(#256).gradethis_error_checker()
, a more robust checking function for general use when the student's submission should not throw an error. (#234)grade_this()
no longer automatically converts errors to fail()
grades, instead authors need to wrap unit-test-style code in fail_if_error()
to convert them to grades. This helps to better differentiate between unexpected errors resulting from the author's grading code and portions of the grading code where errors are expected and indicative of a problem with the user's code. (#254)graded()
helper functions, like fail()
etc, now take a hint
argument that when TRUE
adds a code feedback hint to the custom feedback message. The default value of this argument can be set via gradethis_setup()
. (#216)graded()
helper functions gain a praise
or encourage
argument (respectively) to prepend a random praising phrase when passing or append a random encouraging phrase when failing. The default values of these arguments can be set via gradethis_setup()
. (#227)give_praise()
and give_encouragement()
. Follow the same pattern as give_code_feedback()
to automatically add praise or encouragement to pass()
or fail()
grades, respectively. (#227)fail_if_code_feedback()
. Returns an incorrect grade when there are differences between the user code and solution code (if it exists). (#228)grade_this()
check environment. The help page ?grade_this-objects
describes these objects and documents their purpose, which you can also find by calling one of the placeholders, e.g. .result
. (#232)x
argument of pass_if()
and fail_if()
has been renamed cond
and both functions now work inside grade_this()
, although the function and formula versions are not supported there. (#216)give_code_feedback()
. When applied to a grade_this()
or grade_result()
grading function, code feedback is added to the messages of any fail()
grades. (#219)gradethis_setup()
now uses a new argument order that favors the gradethis-specific options (#212).gradethis.code.feedback
is now gradethis.maybe_code_feedback
. (#219)space_before
and space_after
arguments of maybe_code_feedback()
have been deprecated in favor of more flexible arguments before
and after
that accept arbitrary strings to add before or after the message. (#219)gradethis_setup()
is no longer required if you want to use the default gradethis setup. Simply call library(gradethis)
. You can use gradethis_setup()
to adjust the default values of any options. (#210)gradethis_setup()
. The name changes are:gradethis.code.partial_matching
is now gradethis.allow_partial_matching
gradethis.code.feedback
is now gradethis.fail_code_feedback
gradethis.code.correct
is now gradethis.code_correct
gradethis.code.incorrect
is now gradethis.code_incorrect
gradethis_glue_correct
is now gradethis.glue_correct
gradethis_glue_incorrect
is now gradethis.glue_incorrect
gradethis_glue_correct_test
is now gradethis.glue_correct_test
gradethis_glue_incorrect_test
is now gradethis.glue_incorrect_test
grade_learnr()
is now called gradethis_exercise_checker()
. grade_learnr()
will continue to work but will issue a deprecation warning (#204).pass_if_equal()
now compares the submitted .result
to the exercise .solution
by default (#203).debug_this()
returns information about the various objects available for use by grading code. It is designed for tutorial authors to use during development and can be used in *-check
chunks or inside grade_this()
grading code and the feedback is shown in the tutorial when clicking on Submit Answer. See ?debug_this
for more information. (#203)graded()
and its pass/fail helper functions now accept type
and location
parameters that specify how the feedback is displayed (see learnr Custom Checking for more details about these options).gradethis.glue_pipe
option is now called gradethis.pipe_warning
as it sets the default value of the pipe_warning()
function. pipe_warning()
can be included in the glue strings of other messages, such as those set by gradethis.code.incorrect
(#193).glue_pipe
argument of glue_code()
is now deprecated (#193).____
, now returns clear feedback that students should replace the ____
with code. (#153)exercise.parse.error
global option now accepts a function with one argument. The function is given the gradethis check environment with an additional .error
object containing the parse error condition. (#153)tags
or a tagList()
object for feedback messages. Markdown processing is handled via commonmark. Internally, all code feedback messages now use markdown. (#189)random_praise()
and random_encouragement()
. random_encourage()
has been soft-deprecated (#183).grade_this(expr)
. Evaluates the expression and returns the first grade that is called or error that is thrown.grade_this_code(correct, incorrect)
. Makes a grade from comparing the user code against the solution code. This is a simplified version of grade_code()
.code_feedback()
. Compares the user code against the solution code.grade_feedback()
graded()
now returns and signals a condition with class "gradethis_graded"
instead of returning an object with class "grader_graded"
grade_code()
, grade_result()
, and grade_result_strict()
now return a function that accepts checking arguments to be supplied by grade_learnr()
grade_code()
will now throw an error (rather than returning NULL
) if no solution code is providedevaluate_condition()
now accepts last_value
and env
rather than grader_args
and learnr_args
condition()
s now have a class of "gradethis_condition"
NEWS.md
file to track changes to the package.Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.