On Thu, Dec 14, 2017 at 12:17 PM, Gábor Csárdi <csardi.ga...@gmail.com> wrote:
> On Thu, Dec 14, 2017 at 7:56 PM, Gabriel Becker <gmbec...@ucdavis.edu> > wrote: > > Gabor, > > > > You can grab the connection and destroy it via getConnection and then a > > standard close call. > > Yeah, that's often a possible workaround, but since this connection > was opened by > readLines() internally, I don't necessarily know which one it is. E.g. > I might open multiple > connections to the same file, so I can't choose based on the file name. > > Btw. this workaround seems to work for me: > > read_lines <- function(con, ...) { > if (is.character(con)) { > con <- file(con) > on.exit(close(con)) > } > readLines(con, ...) > } > > This is basically the same as readLines(), but on.exit() does its job here. > That's another clue that it might be an on.exit() issue. Wild guess: > on.exit() does not run if an internal function errors. > It seems to be the setting of a warning handler in tryCatch that does it actually; without that, it works as expected, even when errors are caught. tryCatch(readLines(tempfile(), warn=FALSE), error=function(x) NA) [1] NA *Warning message:* *In file(con, "r") :* * cannot open file '/var/folders/79/l_n_5qr152d2d9d9xs0591lh0000gn/T//RtmpzIZ6Qh/file1ed2e57f2ea': No such file or directory* > showConnections(all=TRUE) description class mode text isopen can read can write 0 "stdin" "terminal" "r" "text" "opened" "yes" "no" 1 "stdout" "terminal" "w" "text" "opened" "no" "yes" 2 "stderr" "terminal" "w" "text" "opened" "no" "yes" > tryCatch(readLines(tempfile(), warn=FALSE), warning=function(x) NA) [1] NA > showConnections(all=TRUE) description 0 "stdin" 1 "stdout" 2 "stderr" 3 "/var/folders/79/l_n_5qr152d2d9d9xs0591lh0000gn/T//RtmpzIZ6Qh/file1ed2300ce801" class mode text isopen can read can write 0 "terminal" "r" "text" "opened" "yes" "no" 1 "terminal" "w" "text" "opened" "no" "yes" 2 "terminal" "w" "text" "opened" "no" "yes" 3 "file" "r" "text" "closed" "yes" "yes" ~G > > > (it actually lists that it is "closed" already, but > > still in the set of existing connections. I can't speak to that > difference). > > It is closed but not destroyed. > > G. > > >> tryCatch( > > > > + readLines(tempfile(), warn = FALSE)[1], > > > > + error = function(e) NA, > > > > + warning = function(w) NA > > > > + ) > > > > [1] NA > > > >> rm(list=ls(all.names = TRUE)) > > > >> gc() > > > > used (Mb) gc trigger (Mb) max used (Mb) > > > > Ncells 257895 13.8 592000 31.7 416371 22.3 > > > > Vcells 536411 4.1 8388608 64.0 1795667 13.7 > > > >> > > > >> showConnections(all = TRUE) > > > > description > > > > 0 "stdin" > > > > 1 "stdout" > > > > 2 "stderr" > > > > 3 > > "/var/folders/79/l_n_5qr152d2d9d9xs0591lh0000gn/T// > RtmpZRcxmh/file128a13bffc77" > > > > class mode text isopen can read can write > > > > 0 "terminal" "r" "text" "opened" "yes" "no" > > > > 1 "terminal" "w" "text" "opened" "no" "yes" > > > > 2 "terminal" "w" "text" "opened" "no" "yes" > > > > 3 "file" "r" "text" "closed" "yes" "yes" > > > >> con = getConnection(3) > > > >> con > > > > A connection with > > > > description > > "/var/folders/79/l_n_5qr152d2d9d9xs0591lh0000gn/T// > RtmpZRcxmh/file128a13bffc77" > > > > class "file" > > > > mode "r" > > > > text "text" > > > > opened "closed" > > > > can read "yes" > > > > can write "yes" > > > >> close(con) > > > >> showConnections(all=TRUE) > > > > description class mode text isopen can read can write > > > > 0 "stdin" "terminal" "r" "text" "opened" "yes" "no" > > > > 1 "stdout" "terminal" "w" "text" "opened" "no" "yes" > > > > 2 "stderr" "terminal" "w" "text" "opened" "no" "yes" > > > > > > > > HTH, > > ~G > > > > On Thu, Dec 14, 2017 at 10:02 AM, Gábor Csárdi <csardi.ga...@gmail.com> > > wrote: > >> > >> Consider this code. This is R 3.4.2, but based on a quick look at the > >> NEWS, this has not been fixed. > >> > >> tryCatch( > >> readLines(tempfile(), warn = FALSE)[1], > >> error = function(e) NA, > >> warning = function(w) NA > >> ) > >> > >> rm(list=ls(all.names = TRUE)) > >> gc() > >> > >> showConnections(all = TRUE) > >> > >> If you run it, you'll get a connection you cannot close(), i.e. the > >> last showConnections() call prints: > >> > >> ❯ showConnections(all = TRUE) > >> description > >> 0 "stdin" > >> 1 "stdout" > >> 2 "stderr" > >> 3 > >> "/var/folders/59/0gkmw1yj2w7bf2dfc3jznv5w0000gn/T//Rtmpc7JqVS/ > filecc2044b2ccec" > >> class mode text isopen can read can write > >> 0 "terminal" "r" "text" "opened" "yes" "no" > >> 1 "terminal" "w" "text" "opened" "no" "yes" > >> 2 "terminal" "w" "text" "opened" "no" "yes" > >> 3 "file" "r" "text" "closed" "yes" "yes" > >> > >> AFAICT, readLines should close the connection: > >> > >> ❯ readLines > >> function (con = stdin(), n = -1L, ok = TRUE, warn = TRUE, encoding = > >> "unknown", > >> skipNul = FALSE) > >> { > >> if (is.character(con)) { > >> con <- file(con, "r") > >> on.exit(close(con)) > >> } > >> .Internal(readLines(con, n, ok, warn, encoding, skipNul)) > >> } > >> <environment: namespace:base> > >> > >> so maybe this just a symptom of an on.exit() issue? > >> > >> Or am I missing something and it is possible to close the connection? > >> > >> Thanks, > >> Gabor > >> > >> ______________________________________________ > >> R-devel@r-project.org mailing list > >> https://stat.ethz.ch/mailman/listinfo/r-devel > > > > > > > > > > -- > > Gabriel Becker, PhD > > Scientist (Bioinformatics) > > Genentech Research > -- Gabriel Becker, PhD Scientist (Bioinformatics) Genentech Research [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel