[Rd] Sweave resource leak: leftover temp files

Duncan Murdoch murdoch at stats.uwo.ca
Fri Jul 8 15:59:45 CEST 2005


On 7/8/2005 9:36 AM, Doran, Harold wrote:
> This is great. Thank you for your help, but let me make sure I fully
> understand. Here is the looping file I use to subset the data frame,
> create a tex file, and Sweave it. This results in N number of tex files
> where N is equal to the number of rows in the data frame.
> 
> list <- unique(wide$stuid)
> master = "master.tex"
> for (i in list){
>      tmp1 <- subset(wide, stuid==i)
>      tmp2 <- paste(i, "tex", sep=".")
>      Sweave("fam_template.Rnw", output=tmp2)
>      file.append("fam_master.tex", tmp2) 
> }
> 
> If I follow correctly, I would need to place these commands inside the
> loop as follows: 
> 
> list <- unique(wide$stuid)
> master = "master.tex"
> for (i in list){
>      tmp1 <- subset(wide, stuid==i)
>      tmp2 <- paste(i, "tex", sep=".")
>      keep <- list.files(tempdir(), full=TRUE)  # keep previous temp
> files
>      Sweave("fam_template.Rnw", output=tmp2)
>      file.append("fam_master.tex", tmp2)
>      temps <- list.files(tempdir(), full=TRUE) unlink(temps[!(temps %in%
> keep)])  # delete the newly created ones 
> }

There's a wordwrapping error there:  the temps <- list.files(...) and 
unlink(temps...) should be on separate lines.

I'd also put them immediately after the Sweave call, but they should be 
fine where you have them.  (The advantage of putting them immediately 
after Sweave is that you don't need to think about the next line.  If it 
created a temp file and you wanted to keep it, you'd need the extra 
lines first.  But it doesn't, so it doesn't really matter.)

Duncan Murdoch
> 
> 
> Thank you for taking the time to look at this.
> 
> Harold
> 
> -----Original Message-----
> From: Duncan Murdoch [mailto:murdoch at stats.uwo.ca] 
> Sent: Friday, July 08, 2005 9:28 AM
> To: Duncan Murdoch
> Cc: Doran, Harold; r-bugs at r-project.org; Uwe Ligges; Sean O'Riordain
> Subject: Sweave resource leak: leftover temp files
> 
> Harold, I've taken a closer look at your example and I'd call this an
> Sweave bug.  It creates tempfiles each time you run it, and doesn't
> delete them at the end.  For example:
> 
>  > list.files(tempdir())
> character(0)
>  > testfile <- system.file("Sweave", "Sweave-test-1.Rnw", package =
> "utils")  > Sweave(testfile, out="junk.tex") Writing to file junk.tex
> Processing code chunks ...
>   1 : print term verbatim
>   2 : term hide
>   3 : echo print term verbatim
>   4 : term verbatim
>   5 : echo term verbatim
>   6 : echo term verbatim eps pdf
>   7 : echo term verbatim eps pdf
> 
> You can now run LaTeX on 'junk.tex'
>  > list.files(tempdir())
>   [1] "Rf10523" "Rf13872" "Rf17129" "Rf2055"  "Rf2203"  "Rf2403"
> "Rf27095"
>   [8] "Rf2892"  "Rf31415" "Rf5290"  "Rf6251"  "Rf6482"  "Rf7055"
> "Rf724"
>  > Sweave(testfile, out="C:/temp/junk.tex") Writing to file
> C:/temp/junk.tex Processing code chunks ...
>   1 : print term verbatim
>   2 : term hide
>   3 : echo print term verbatim
>   4 : term verbatim
>   5 : echo term verbatim
>   6 : echo term verbatim eps pdf
>   7 : echo term verbatim eps pdf
> 
> You can now run LaTeX on 'C:/temp/junk.tex'
>  > list.files(tempdir())
>   [1] "Rf10523" "Rf12679" "Rf1311"  "Rf13484" "Rf13872" "Rf17129"
> "Rf17288"
>   [8] "Rf2055"  "Rf21774" "Rf2203"  "Rf23417" "Rf2403"  "Rf27095"
> "Rf2892"
> [15] "Rf29444" "Rf31128" "Rf31415" "Rf32520" "Rf3338"  "Rf5290"
> "Rf5551"
> [22] "Rf6251"  "Rf6482"  "Rf7055"  "Rf724"   "Rf7543"  "Rf758"
> "Rf7673"
>  > unlink(list.files(tempdir(),full=T))
>  > list.files(tempdir())
> character(0)
> 
> Harold:  a workaround for this would be to wrap your Sweave call in
> something like this:
> 
> keep <- list.files(tempdir(), full=TRUE)  # keep previous temp files
> 
> ... Call Sweave here ...
> 
> temps <- list.files(tempdir(), full=TRUE) unlink(temps[!(temps %in%
> keep)])  # delete the newly created ones
> 
>



More information about the R-devel mailing list