Re: [Rd] isOpen on closed connections

From: Henrik Bengtsson <hb_at_stat.berkeley.edu>
Date: Thu, 15 Nov 2007 00:33:24 -0800

My solution the original post is to always set 'con <- NULL' after closing a connection, and then test for NULL. This is how I do to make sure to make sure that opened connections are closed and as soon as possible.

foo <- function(...) {
  con <- file("foo.R", open="r"):
  on.exit({
    if (!is.null(con)) {

      close(con);
      con <- NULL;

    }
  })

  # Do some thing that might cause foo() to exit.   bar();

  # Do some thing else
  cat(con, "foo");
  # Close connection as soon as possible   close(con);
  con <- NULL;

  # Do more things before returning
}

However, is there a reason for not having isOpen() return FALSE after close() with the logic that a destroy connection is also a non-open one? So, basically:

isOpen <- function (con, rw = "") {
  rw <- pmatch(rw, c("read", "write"), 0)   res <- FALSE
  tryCatch({
    res <- .Internal(isOpen(con, rw))
  }, error = function(ex) {
  })
  res
}

EXAMPLE:
> con <- file("foo.R")
> print(isOpen(con))

[1] FALSE
> open(con, "w")
> print(isOpen(con))

[1] TRUE
> close(con)
> print(isOpen(con))

[1] FALSE
> open(con, "w")

Error in open.connection(con, "w") : invalid connection

If there is a use case that needs to test if a connection has been destroyed, it would be more natural to add isDestroyed(), although I cannot really see where it should be needed.

/Henrik

On Nov 14, 2007 11:18 PM, Prof Brian Ripley <ripley_at_stats.ox.ac.uk> wrote: 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 Nov 14, 2007 11:18 PM, Prof Brian Ripley <ripley_at_stats.ox.ac.uk> wrote:

> 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@stats.ox.ac.uk
> Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/<http://www.stats.ox.ac.uk/%7Eripley/>
> University of Oxford, Tel: +44 1865 272861 (self)
> 1 South Parks Road, +44 1865 272866 (PA)
> Oxford OX1 3TG, UK Fax: +44 1865 272595
>
> ______________________________________________
> R-devel_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

        [[alternative HTML version deleted]]



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu 15 Nov 2007 - 08:38:22 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 15 Nov 2007 - 09:30:18 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.