On Jul 21, 2009, at 6:40 PM, Duncan Murdoch wrote:
> On 21/07/2009 5:03 PM, Jim Nemesh wrote:
>> Hi! I'm wondering if there's a smart way around this:
>> fileName= (some valid file on your system)
>> > fileCon=file(fileName, open="rt")
>> > l<-readLines (fileCon, n= 1)
>> >
>> > isOpen(fileCon)
>> [1] TRUE
>> > close(fileCon)
>> > isOpen(fileCon)
>> Error in isOpen(fileCon) : invalid connection
>> How do you test for a file being closed if isOpen gives you an
>> error message?
>
> You could use try().
>
> But you shouldn't be doing that. Whoever opens the connection
> should close it. The isOpen() test is designed to be used on newly
> created connections, being passed to some other function and
> guaranteed to be valid. Was it created with file(fileName,
> open="rt") or file(fileName)? That's what isOpen() is there to
> determine. (The first one was opened, and should be closed by
> whoever opened it; the second one was not, and the function that
> uses it shouldn't leave it open.)
>
> Duncan Murdoch
>
The story is of course slightly more complicated. I'm writing a
streaming caching file input class. When you instantiate the class,
you open a connection (as shown in the sample code.) I wanted to
close the file input when either a) I run out of lines in the file b)
when the class is garbage collected. There's something fishy going on
with the connection, as it always claims to be invalid when I try to
close it, yet it reads data out perfectly fine.
Essentially, I'm always getting warnings about not closing the file,
but I can't close the file!
Some paired down "real world" code (using R.oo Library)
setConstructorS3("StreamingFileReader", function(fileName) {
if (missing (fileName)) fileName =NA
extend(Object(), "StreamingFileReader",
.fileName=fileName,
.fileCon=NA,
.initialized=F)
})
setMethodS3("init", "StreamingFileReader", function(this, ...){
if (this$.initialized==F) {
this$.fileCon=file(this$.fileName, open="rt")
#read header
if (this$.hasHeader) {
l<-readLines (this$.fileCon, n= 1)
l<-strsplit (l, '\t')[[1]]
this$.header=l
}
this$.initialized=T
}
})
setMethodS3("getHeader", "StreamingFileReader", function(this,
numLines=1, ...) {
this$init()
return (this$.header);
})
#lots of attempts to remove, cleanup, etc the connection I'm holding
on to.
setMethodS3("finalize", "StreamingFileReader", function(this, ...) {
#if (this$.hasMoreData==F) return()
#if (is.na(this$.fileCon)) return()
#rm (this$.fileCon)
#print (isOpen(this$.fileCon))
#close(this$.fileCon)
#close(this$.fileCon)
})
[[alternative HTML version deleted]]
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.