[R-pkg-devel] Working with connections - What is correct?

Joshua Ulrich josh.m.ulrich at gmail.com
Tue Aug 11 13:11:18 CEST 2015


On Mon, Aug 10, 2015 at 10:18 PM, Glenn Schultz <glennmschultz at me.com> wrote:
> Hi Dirk,
> Thanks for your response, I get the point on return(). For me, it is a
> security blanket - I just need to let that go rather than justify keeping
> it. I will refactor the connections and just get comfortable without
> return().
>
I'm not sure you get Dirk's point about return(). He did not suggest
that you avoid using return(). He provided a simple example to
illustrate that code in a function body that occurs after a call to
return() is not evaluated.  There is nothing inherently wrong with
using return().  The only thing that was wrong was how you used it.

> Thanks,
> Glenn
>
>
> On Aug 10, 2015, at 09:59 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
>
>
> On 11 August 2015 at 02:09, Glenn Schultz wrote:
> | All,
> | Is my function just plain wrong or is it just programming style?  I use
> connections because SODA (software for data analysis) recommends using
> connections when working with serialized files.
>
> Nothing wrong with connections. Many of us use them.
>
> | First, after researching the use of return() - following Joshua's comment
> and others I found a post on SO regarding return().
> http://stackoverflow.com/questions/11738823/explicitly-calling-return-in-a-function-or-not
>
> Let's try once more. The function foo()
>
> foo <- function() {
> x <- 2
> return(x)
> x <- 3
> }
>
> will return what value? Ie what does 'print(foo())' show?
>
> | Second, Hadley's point regarding the use of RDS in gz function being a
> little strange. Following the help files the function is fashioned after the
> following which I found in R help files:
>
> IIRC what Hadley was trying to say what you do _not_ need to compress before
> inserting into a rds file as the rds file format compresses by default.
>
> In other words compression comes for free, and effortlessly so.
>
> Hth, Dirk
>
> | ## Less convenient ways to restore the object
> | ## which demonstrate compatibility with unserialize()
> | con <- gzfile("women.rds", "rb")
> | identical(unserialize(con), women)
> | close(con)
> | con <- gzfile("women.rds", "rb")
> | wm <- readBin(con, "raw", n = 1e4) # size is a guess
> | close(con)
> | identical(unserialize(wm), women)
> | | With respect to the first, I understand why my function would be
> considered "buggy" - that can be fixed. It is the case, generally speaking,
> one does not need return() when programming in R; it is a functional
> language.  However, some use return() and one finds return(value) in the R
> help files.  Is it a strict no-no to use return()?
> | | With respect to the second, The function can be refactored and reduced
> to readRDS().  My question, is using gz file overkill or just plain wrong?
> | What is considered "best practice"?
> | | -Glenn
> | | | On Aug 09, 2015, at 09:04 AM, Joshua Ulrich <josh.m.ulrich at gmail.com>
> wrote:
> | | On Sun, Aug 9, 2015 at 8:59 AM, Glenn Schultz <glennmschultz at me.com>
> wrote:
> | Hi All,
> | | I use connections to open and close data folders needed by my package.
> | After each function closes I get the following warnings (depending on the
> | connection that has been opened).
> | | 10: closing unused connection 3
> |
> (/Library/Frameworks/R.framework/Versions/3.2/Resources/library/BondLab/BondData/bondlabMBS4.rds)
> | | Below is the connection function that is related to the above warning:
> | |
> #------------------------------------------------------------------------------------
> | #' A connection function to BondData calling MBS cusps
> | #'
> | #' Opens a connection to the BondData folder to call MBS cusip data
> | #' @param MBS.id A character string the MBS.id or cusip number current
> | MBS.id is supported
> | #' @export
> | MBS <- function(MBS.id = "character"){
> | MBS.Conn <- gzfile(description = paste(system.file(package
> | = "BondLab"),
> | "/BondData/", MBS.id, ".rds", sep = ""), open
> | = "rb")
> | MBS <- readRDS(MBS.Conn)
> | return(MBS)
> | close.connection(MBS.Conn)
> | }
> | | I have googled this warning and it seems to be triggered when a function
> | terminates and the connection is open. But, I think the connection
> function
> | closes the connection once the object is returned. What am I doing wrong?
> | | Your call to return() exits the function, so the close.connection()
> | call is never evaluated. Considering using on.exit() to close the
> | connection, since it will close the connection regardless of how the
> | function exits (e.g. because of an error).
> | | -Glenn
> | ______________________________________________
> | R-package-devel at r-project.org mailing list
> | https://stat.ethz.ch/mailman/listinfo/r-package-devel
> | | | | -- | Joshua Ulrich | about.me/joshuaulrich
> | FOSS Trading | http://www.fosstrading.com
> | ______________________________________________
> | R-package-devel at r-project.org mailing list
> | https://stat.ethz.ch/mailman/listinfo/r-package-devel
>
> --
> http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
> ______________________________________________
> R-package-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel



-- 
Joshua Ulrich  |  about.me/joshuaulrich
FOSS Trading  |  www.fosstrading.com



More information about the R-package-devel mailing list