[Rd] Testthat and global environments in R packages on CRAN

Måns Magnusson mons.magnusson at gmail.com
Sun Feb 8 18:16:05 CET 2015


The problem is that the test environment inherits from the global environment. See https://github.com/hadley/testthat/blob/master/R/test-files.r

The students labs are simply an R script file. Say that they have an assignment to calculate sqrt(2) and store it in variable a. In the same session they should be able to test the script file when they are done (using a function mark_my_file() in the package). This function will call the testthat tests. 

Say that I have two unit tests. One tests if an object called 'a' exists in the file and the second one tests if 'a' is sqrt(2) and return messages to the students pointing them in the right direction (ie 'a' is missing or is wrong).

The problem is the if the student have an other object 'a' in the global environment but do not create 'a' in their R script file. In this case testthat test will follow the search path and find the object in the global environment and return the wrong (or none) error message due to the global environment.

The only way around this problem is to temporarily store the global environment, clean it and run the tests, and the reload the old global environment. But this solution will not be publishable on CRAN.

I hope this can clarify the problem.

Kind regards

Skickat från min iPhone

> 8 feb 2015 kl. 16:46 skrev Duncan Murdoch <murdoch.duncan at gmail.com>:
>> On 08/02/2015 8:22 AM, Måns Magnusson wrote:
>> Hi!
>> Im currently developing an R package to automatically give students
>> feedback on programming assignments in R. I use the testthat package as an
>> engine for the unit testing and do a wrapper to make the automatic marking
>> easy for the students.
>> One function (called mark_my_file() ) will mark the students lab file using
>> testthat tests and a new (simple) reporter. The problem is that I need to
>> do the marking of the lab with an empty global environment (due to the
>> testthat package).
>> So my first thought was to:
>> 1) store the global environement in the temporary directory as an
>> .Rdata-file
>> 2) clean the global environment
>> 3) run the tests
>> 4) clean the global environment (from the student lab file)
>> 5) reload the old global environment
>> But the problem is that it is not possible to publish packages on CRAN that
>> modifies the global environment.
>> Is there anyone that have any solutions/ideas to this problem?
>> The package can be found here:
>> https://github.com/MansMeg/markmyassignment
> I don't think that testthat requires you to use the global environment.
> Could you give some example code to show where you think you need it?
> Someone could probably come up with a different formulation.
> Duncan Murdoch

	[[alternative HTML version deleted]]

More information about the R-devel mailing list