Re: [Rd] warning upon automatic close of connection

From: Seth Falcon <sfalcon_at_fhcrc.org>
Date: Wed, 12 Sep 2007 07:05:28 -0700

"Gabor Grothendieck" <ggrothendieck_at_gmail.com> writes:
> I noticed that under R 2.6.0 there is a warning about closing the connection
> in the code from this post:
> https://stat.ethz.ch/pipermail/r-help/2007-September/140601.html
>
> which is evidently related to the following from the NEWS file:
>
> o Connections will be closed if there is no R object referring to
> them. A warning is issued if this is done, either at garbage
> collection or if all the connection slots are in use.
>
> If we use read.table directly it still happens:
>
> # use Lines and Lines2 from cited post
> library(zoo)
> DF1 <- read.table(textConnection(Lines), header = TRUE)
> DF2 <- read.table(textConnection(Lines2), header = TRUE)
> z1 <- zoo(as.matrix(DF1[-1]), as.Date(DF1[,1], "%d/%m/%Y"))
> z2 <- zoo(as.matrix(DF2[-1]), as.Date(DF2[,1], "%d/%m/%Y"))
> both <- merge(z1, z2)
> plot(na.approx(both))
>
>> R.version.string # Vista
> [1] "R version 2.6.0 alpha (2007-09-06 r42791)"
>
> Is this annoying warning really necessary? I assume we can get rid of
> it by explicitly naming and closing the connections but surely there should
> be a way to avoid the warning without going to those lengths.

Up until the change you mention above it really was necessary to name and close all connections. Short scripts run in fresh R sessions may not have had problems with code like you have written above, but longer programs or shorter ones run in a long running R session would run out of connections.

Now that connections have weak reference semantics, one can ask whether this behavior should be "standard" and no warning issued.

> I would have thought that read.table opens the connection then it would
> close it itself so no warning would need to be generated.

In your example, read.table is _not_ opening the connection. You are passing an open connection which has no symbol bound to it:

   foo = ""
   c = textConnection(foo)
   c

     description            class             mode             text 
           "foo" "textConnection"              "r"           "text" 
          opened         can read        can write 
        "opened"            "yes"             "no" 

But I think passing a closed connection would cause the same sort of issue. It seems that there are two notions of "closing a connection": (i) close as the opposite of open, and (ii) clean up the entire connection object. I haven't looked closely at the code here, so I could be wrong, but I'm basing this guess on the following:

> file("foo")

description       class        mode        text      opened    can read 
      "foo"      "file"         "r"      "text"    "closed"       "yes" 
  can write 
      "yes" 

## start new R session
for (i in 1:75) file("foo")
gc()
warnings()[1:3]
> gc()
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 149603  4.0     350000  9.4   350000  9.4
Vcells 101924  0.8     786432  6.0   486908  3.8
There were 50 or more warnings (use warnings() to see the first 50)
> warnings()[1:3]

$`closing unused connection 76 (foo)`
NULL $`closing unused connection 75 (foo)`
NULL $`closing unused connection 74 (foo)`
NULL
-- 
Seth Falcon | Computational Biology | Fred Hutchinson Cancer Research Center
BioC: http://bioconductor.org/
Blog: http://userprimary.net/user/

______________________________________________
R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Wed 12 Sep 2007 - 14:17:42 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 Fri 21 Sep 2007 - 14:41:09 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.