From ripley at stats.ox.ac.uk  Thu Nov 15 08:18:42 2007
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Thu, 15 Nov 2007 07:18:42 +0000 (GMT)
Subject: [Rd] isOpen on closed connections
In-Reply-To: <m2hcjoksd6.fsf@userprimary.net>
References: <473B0739.3090507@jhsph.edu> <m2hcjoksd6.fsf@userprimary.net>
Message-ID: <Pine.LNX.4.64.0711150714150.11152@gannet.stats.ox.ac.uk>

I think the confusion here is over close(): that closes *and destroys* a 
connection, so it no longer exists.

isOpen applies to existing connections: you cannot close but not destroy 
them at R level, but C code can (and does).  You will see it in use in the 
utils package.


On Wed, 14 Nov 2007, Seth Falcon wrote:

> "Roger D. Peng" <rpeng at jhsph.edu> writes:
>
>> As far as I can tell, 'isOpen' cannot return FALSE in the case when 'rw = ""'.
>> If the connection has already been closed by 'close' or some other function,
>> then isOpen will produce an error.  The problem is that when isOpen calls
>> 'getConnection', the connection cannot be found and 'getConnection' produces an
>> error.  The check to see if it is open is never actually done.
>
> I see this too with R-devel (r43376) {from Nov 6th}.
>
>    con = file("example1", "w")
>    isOpen(con)
>
>    [1] TRUE
>
>    showConnections()
>
>      description class  mode text   isopen   can read can write
>    3 "example1"  "file" "w"  "text" "opened" "no"     "yes"
>
>    close(con)
>    isOpen(con)
>
>    Error in isOpen(con) : invalid connection
>
>    ## printing also fails
>    con
>    Error in summary.connection(x) : invalid connection
>
>> This came up in some code where I'm trying to clean up connections after
>> successfully opening them.  The problem is that if I try to close a connection
>> that has already been closed, I get an error (because 'getConnection' cannot
>> find it).  But then there's no way for me to find out if a connection has
>> already been closed.  Perhaps there's another approach I should be taking?  The
>> context is basically,
>>
>> con <- file("foo", "w")
>>
>> tryCatch({
>> 	## Do stuff that might fail
>> 	writeLines(stuff, con)
>> 	close(con)
>>
>> 	file.copy("foo", "bar")
>> }, finally = {
>> 	close(con)
>> })
>
> This doesn't address isOpen, but why do you have the call to close
> inside the tryCatch block?  Isn't the idea that finally will always be
> run and so you can be reasonably sure that close gets called once?
>
> If your real world code is more complicated, perhaps you can make use
> of a work around like:
>
> myIsOpen = function(con) tryCatch(isOpen(con), error=function(e) FALSE)
>
> You could do similar with myClose and "close" a connection as many
> times as you'd like :-)
>
> + seth
>
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] isOpen on closed connections
Prof Brian Ripley