[R-pkg-devel] How to write example results to a tempdir()?

Spencer Graves spencer.graves at effectivedefense.org
Thu Apr 26 15:28:30 CEST 2018

On 2018-04-26 07:11, Jose A Guijarro wrote:
> El 25/04/18 a las 20:21, Duncan Murdoch escribió:
>> On 25/04/2018 1:32 PM, Sarah Goslee wrote:
>>> Don't change the working directory! That has all kinds of unpleasant
>>> side effects for the unsuspecting user, possibly even more so than
>>> writing to a file.
>>> Instead, write the file to the temp directory, and read it from 
>>> there, with e.g.
>>> wd <- tempdir()
>>> write(dat, file.path(wd, 'Ttest_1981-2000.dat'))
>>> Using file.path() means that the appropriate path delimiter for that
>>> OS will be used.
>> That's one good way to do it.  But it is possible to change directory 
>> and change back at the end of the example.  For example,
>> wd <- tempdir()
>> savedir <- setwd(wd)
>> ... # the original code that writes and reads in the current dir
>> setwd(savedir)
>> There's a worry that an error in the middle of the code will leave 
>> the user in the wrong place.  If that's really unlikely to happen, 
>> then this code is a little simpler than Sarah's suggestion.
>> If it is likely, you can use tryCatch(..., finally = setwd(savedir)), 
>> but I think Sarah's solution would be preferable in most cases:  many 
>> users will not understand what tryCatch() does.

Hi, Duncan, et al.:

       Under what circumstances should one also use "on.exit":

wd <- tempdir()
savedir <- setwd(wd)

       Even senior R programmers may miss a failure mode.  In a 
function, this works well:  I don't need to remember to "setwd(savedir)" 
later in the code, which could be a problem if I have multiple exit 
points.  I don't know how it would work in a vignette or the examples 
section of a *.Rd file.  tryCatch(..., finally = setwd(savedir)) 
condenses this into one line ... and is too terse for me in many cases.

       Spencer Graves

>> Duncan Murdoch
> Many thanks for the suggestion! In this way I only need to apply 
> slight changes in the examples and can avoid modifying all read/writes 
> along the package. I will try this approach and see if it passes the 
> CRAN checks.
> Jose
>>> Sarah
>>> On Wed, Apr 25, 2018 at 12:30 PM, Jose A Guijarro 
>>> <jguijarrop at aemet.es> wrote:
>>>> Dear all,
>>>> I am struggling to update my package climatol from version 3.0 to 3.1.
>>>> The old version had all examples under a "dontrun" section because 
>>>> they
>>>> needed files created by other examples that the user had to run first.
>>>> As this is not acceptable anymore, I made the examples runnable and
>>>> prepared small ad-hoc datasets, but then writing files to the user 
>>>> space
>>>> is against the CRAN policy rules, and I was suggested to run them on a
>>>> temporal directory. Therefore I changed all my examples to read/write
>>>> files to a tempdir(), as in:
>>>> \examples{
>>>> #Set a temporal working directory and write input files:
>>>> wd <- tempdir()
>>>> setwd(wd)
>>>> data(Ttest) #(This loads matrix 'dat' and data.frame 'est.c')
>>>> write(dat,'Ttest_1981-2000.dat')
>>>> write.table(est.c,'Ttest_1981-2000.est',row.names=FALSE,col.names=FALSE) 
>>>> rm(dat,est.c) #remove loaded data from memory space
>>>> #Now run the example:
>>>> dd2m('Ttest',1981,2000)
>>>> #Input and output files can be found in directory:
>>>> print(wd)
>>>> }
>>>> But now CRAN checks return this warning ten times (one for every 
>>>> example
>>>> in the package):
>>>> Warning: working directory was changed to ‘/tmp/RtmpWSRK2F’, resetting
>>>> Any hint on how to solve the problem will be highly appreciated...
>>>> Jose
> ______________________________________________
> R-package-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel

More information about the R-package-devel mailing list