[R-pkg-devel] Is using global assignment in package tests allowed?

Ben Bolker bbo|ker @end|ng |rom gm@||@com
Thu Jan 27 17:18:28 CET 2022


   I will chime in briefly.

   I have spent hours trying to understand the scoping behaviour of 
testthat, mostly without success. I have lots of examples where I have 
tests that fail *only* when running devtools::check(), but not when 
running test_that in an interactive session, or in the same code run via 
source() or in an R batch session.  So I am quite sympathetic to "beyond 
my ken".

   I agree that it's best to understand everything so that you can know 
when you might run into trouble in the future, but I have sometimes 
reconciled myself to giving up when it seemed I was spending much more 
time debugging my tests than debugging the actual package code ...

   For what it's worth, I have found that running <<- in these contexts 
doesn't seem to bother CRAN at all -- possibly because it's the *tests* 
that are potentially modifying the global environment, not the package 
itself.

   If you think about it, a prohibition on modifying the global 
environment in tests would mean that a plain old test file that assigned 
variables as part of testing flow would change the environment.

On 1/27/22 10:56 AM, James Pustejovsky wrote:
> But I am not using global variables at all in the package code (in
> /R)---only for unit testing. Is this distinction relevant? Or do I need to
> avoid global assignment even in the unit tests?
> 
> On Thu, Jan 27, 2022 at 9:40 AM Dirk Eddelbuettel <edd using debian.org> wrote:
> 
>>
>> On 27 January 2022 at 07:20, Jeff Newmiller wrote:
>> | I don't know the answer to your question, but "beyond my ken" doesn't
>> sound like a very convincing reason. Mucking with any environment that
>> isn't yours is asking for trouble... the behavior you depend on today may
>> come into conflict with the code you are coordinating with when you least
>> expect it.
>>
>> Right on.
>>
>> Yes a number of packages (of mine and other people) use a different
>> approach
>> to maintain 'global state' without ... using 'global variables' (== bad).
>>
>> The trick is something like `pkgenv <- new.env()` in R/zzz.R and to then
>> also
>> set an option or two you need in .onLoad as eg  `pkgenv[["prefence"]] <-
>> "foo"`
>> which you can later test for, alter, ... at will.
>>
>> All without running afould of what `R CMD check --as-cran` may hate, all
>> the
>> while maintaining your logic flow.
>>
>> Dirk
>>
>> --
>> https://dirk.eddelbuettel.com | @eddelbuettel | edd using debian.org
>>
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-package-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel

-- 
Dr. Benjamin Bolker
Professor, Mathematics & Statistics and Biology, McMaster University
Director, School of Computational Science and Engineering
(Acting) Graduate chair, Mathematics & Statistics



More information about the R-package-devel mailing list