So doesn't the fact that a function contains a reference to an environment suggest that this whole exercise is a really bad idea? -- Sent from my phone. Please excuse my brevity.
On February 12, 2017 4:05:31 PM PST, Bert Gunter <bgunter.4...@gmail.com> wrote: >It worked fine for me: > >> t <- rnorm(100) >> cdf <- ecdf(t) >> >> trans <- function(x) qnorm(cdf(x) * 0.99) >> saveRDS(trans, "/tmp/foo") >> trans(1.2) >[1] 1.042457 >> trans1 <- readRDS("/tmp/foo") >> trans1(0) >[1] 0.1117773 > > >Of course, if I remove cdf() from the global environment, it will fail: > >> rm(cdf) >> trans1(0) >Error in qnorm(cdf(x) * 0.99) : could not find function "cdf" > >So it looks like you're clearing you global workspace in between >saving and loading? > >You may need to read up on function closures/lexical scoping : A >user-defined function in R includes not only code but also a pointer >to the environment in which it was defined, in your case, the global >environment from which you apparently removed cdf(). Note that >functions are not evauated until called, so free variables in the >functions that do not or will not exist in the function's lexical >scope when called will not trigger any errors until the function *is* >called. > >Same comments for your second version -- if tmp is removed the >function will fail. > > > >Cheers, >Bert > > >Bert Gunter > >"The trouble with having an open mind is that people keep coming along >and sticking things into it." >-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > > >On Sun, Feb 12, 2017 at 2:11 PM, George Trojan - NOAA Federal ><george.tro...@noaa.gov> wrote: >> I can't figure out how to save functions to RDS file. Here is an >example >> what I am trying to achieve: >> >>> t <- rnorm(100) >>> cdf <- ecdf(t) >>> cdf(0) >> [1] 0.59 >>> saveRDS(cdf, "/tmp/foo") >>> >> Save workspace image? [y/n/c]: n >> [gtrojan@asok petproject]$ R >>> cdf <- readRDS("/tmp/foo") >>> cdf >> Empirical CDF >> Call: ecdf(t) >> x[1:100] = -2.8881, -2.2054, -2.0026, ..., 2.0367, 2.0414 >> >> This works. However when instead of saving cdf() I try to save >function >> >>> trans <- function(x) qnorm(cdf(x) * 0.99) >> >> after restoring object from file I get an error: >> >>> trans <- readRDS("/tmp/foo") >>> trans(0) >> Error in qnorm(cdf(x) * 0.99) : could not find function "cdf" >> >> I tried to define and call cdf within the definition of trans, >without >> success: >> >>> tmp <- rnorm(100) >>> trans <- function(x) { cdf <- ecdf(tmp); cdf(0); qnorm(cdf(x)) * >0.99 } >>> saveRDS(trans, "/tmp/foo") >> Save workspace image? [y/n/c]: n >> >>> trans <- readRDS("/tmp/foo") >>> trans >> function(x) { cdf <- ecdf(tmp); cdf(0); qnorm(cdf(x)) * 0.99 } >>> trans(0) >> Error in sort(x) : object 'tmp' not found >> >> So, here the call cdf(0) did not force evaluation of my random >sample. What >> am I missing? >> >> George >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide >http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. > >______________________________________________ >R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >https://stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide >http://www.R-project.org/posting-guide.html >and provide commented, minimal, self-contained, reproducible code. ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.