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

Duncan Murdoch murdoch.duncan at gmail.com
Thu Apr 26 18:27:37 CEST 2018


On 26/04/2018 9:28 AM, Spencer Graves wrote:
> 
> 
> 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)
> on.exit(setwd(savedir))?
> 
> 
>         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.
> 

As you say, on.exit() is appropriate in a function.  It is not 
appropriate in example code.

It's not really defined when it should execute in example code.  If I 
run example(foo), the on.exit() appears to run right away, not waiting 
for the end.  I'd guess it gets installed in the function that runs the 
example code, possibly messing it up.

If I cut and paste from the help page, the on.exit() expression doesn't 
seem to run at all.

I'd expect that a vignette would be similar to example(foo), but I 
haven't tried.

Duncan Murdoch

> 
>         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
> 
> ______________________________________________
> 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