[R-pkg-devel] Writing to files without altering working directory in R package

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Tue May 7 19:57:06 CEST 2019


On 06/05/2019 12:16 p.m., Jim Hester wrote:
> For what it's worth, the recommendation to use `tempfile()` is very
> confusing to R users.
> 
> Often users (particularly new users) jump directly to examples when
> reading documentation and when you have these more complicated
> examples they do not realize they can just use a simple string
> literal.
> 
> See https://github.com/tidyverse/readr/issues/635 for an issue where
> multiple users explicitly request examples which do _not_ use
> `tempfile()`.

I think beginners rarely like the help pages, and that's really to be 
expected:  help pages need to be complete and correct, and beginners 
really need a small subset of possibilities.  Beginners need tutorials.

In the Github issue, you mentioned pollution of the working directory, 
but I think a bigger problem is destruction of user data, e.g. if a user 
has a file "wine.csv", and the example writes to that file.

So you need to do something to protect users.  I think making examples a 
little complicated by using setwd(tempdir()) with a literal filename, or 
writing to tempfile() is worth it.

Duncan Murdoch

> 
> On Fri, May 3, 2019 at 7:59 PM Duncan Murdoch <murdoch.duncan using gmail.com> wrote:
>>
>> On 03/05/2019 6:33 p.m., Jarrett Phillips wrote:
>>> Hello,
>>>
>>> My R package has a function with an argument to specify whether numerical
>>> results should be outputted to a CSV file.
>>>
>>> CRAN policy stipulates verbatim that
>>>
>>> Packages should not write in the user’s home filespace (including
>>> clipboards), nor anywhere else on the file system apart from the R
>>> session’s temporary directory (or during installation in the location
>>> pointed to by TMPDIR: and such usage should be cleaned up). Installing into
>>> the system’s R installation (e.g., scripts to its bin directory) is not
>>> allowed.
>>>
>>> I know I should use tempdir() within my package function, but I've not seen
>>> any examples on how this is best done within existing R packages.
>>>
>>> Within my package documentation examples for my function, I have the lines:
>>>
>>>    \dontshow{.oldwd <- setwd(tempdir())}
>>>
>>> ... some R code ...
>>>
>>> \dontshow{setwd(.oldwd)}
>>>
>>> but I have been informed that this is not the accepted way.
>>>
>>> Any ideas from the community on how do do this properly?
>>
>> Use the tempfile() function to generate a filename in the temporary
>> directory.  You might want to use the "pattern" or "fileext" arguments,
>> but don't change the "tmpdir" argument.
>>
>> Then write to that file.
>>
>> For example,
>>
>> filename <- tempfile(fileext = ".csv")
>> write.csv(df, filename)
>>
>> It's a good idea to clean up afterwards using
>>
>> unlink(filename)
>>
>> ______________________________________________
>> R-package-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-package-devel



More information about the R-package-devel mailing list