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

Henrik Bengtsson henrik.bengtsson at gmail.com
Thu Apr 26 20:25:15 CEST 2018


For the information: there were various ideas discussed around this in
R-devel thread 'Base R examples that write to current working
directory' started on 2018-03-29
(https://stat.ethz.ch/pipermail/r-devel/2018-March/075779.html).

On Thu, Apr 26, 2018 at 10:31 AM, Jennifer Bryan
<jenny.f.bryan at gmail.com> wrote:
> One downside of all of this is that examples become increasingly dominated
> by code re: tempdir setup and the like.
>
> It may not discourage the people on this list, but I suspect too much extra
> machinery makes the typical user less likely to engage with examples.
>
> On Thu, Apr 26, 2018 at 10:04 AM, Henrik Bengtsson
> <henrik.bengtsson at gmail.com> wrote:
>>
>> On Thu, Apr 26, 2018 at 6:28 AM, Spencer Graves
>> <spencer.graves at effectivedefense.org> 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.
>>
>> FWIW, it can also be used in a local() call, e.g.
>>
>> local({
>>   wd <- tempdir()
>>   savedir <- setwd(wd)
>>   on.exit(setwd(savedir))
>>   [...]
>> })
>>
>> /Henrik
>>
>> >
>> >
>> >       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
>>
>> ______________________________________________
>> 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