If it was any other environment than the global, you could use substitute: e <- new.env() delayedAssign("foo", stop("Hey!"), assign.env = e) substitute(foo, e)
delayedAssign("foo", stop("Hey!")) substitute(foo) Hadley On Mon, Jan 26, 2015 at 12:53 PM, Henrik Bengtsson <h...@biostat.ucsf.edu> wrote: > Hi, I got an interesting programming challenge: > > How do you inspect an object which is assigned via delayedAssign() and > that throws an error as soon as it is "touched" (=the value is > evaluated)? Is it possible? > > > MINIMAL EXAMPLE: > > $ R --vanilla >> delayedAssign("foo", stop("Hey!")) > > (If you find this minimal example silly/obvious, please skip down to > the real example at the end) > >> foo > Error: Hey! > >> str(foo) > Error in str(foo) : Hey! > In addition: Warning message: > In str(foo) : restarting interrupted promise evaluation > >> mode(foo) > Error in mode(foo) : Hey! > In addition: Warning message: > In mode(foo) : restarting interrupted promise evaluation > >> .Internal(inspect(foo)) > Error: Hey! > In addition: Warning message: > restarting interrupted promise evaluation > >> traceback() > 1: stop("Hey!") > > Is there anyway I can inspect this object using the R API without > evaluating the value in the delayed assignment? Is it possible to > test if this is a delayed assigned or not? > > > BACKGROUND: > The background to this is where I have a function in the R.oo package > that scans namespaces for functions with a certain class attribute. > For this I use is.function() and inherits() to inspect each object. > An aroma.affymetrix user reported on a problem that boiled down to the > following: > > # source("http://bioconductor.org/biocLite.R"); biocLite("hgu133a.db") >> library("hgu133a.db") >> is.function(hgu133aPFAM) > Error: hgu133aPFAM is defunct. Please use select() if you need access to PFAM > or PROSITE accessions. >> .Internal(inspect(hgu133aPFAM)) > >> traceback() > 3: stop(paste(msg, collapse = ""), call. = FALSE, domain = NA) > 2: .Defunct(msg = msg) > 1: (function () > { > if (grepl("PFAM", x)) { > bimapName <- paste0(prefix, "PFAM") > } > else { > bimapName <- paste0(prefix, "PROSITE") > } > x <- dc[[bimapName]] > msg = wmsg(paste0(bimapName, " is defunct. ", "Please use select() if > you > need access to PFAM or PROSITE accessions. \n")) > if (interactive()) { > .Defunct(msg = msg) > } > })() > > My immediate solution is to perform those tests using tryCatch(), but > this is interesting, because this function is such that the error is > only thrown in interactive() sessions, i.e. the following works: > > $ Rscript -e "hgu133a.db::hgu133aPFAM" > [...] > NULL > > This is probably also why none of my aroma.affymetrix system tests > caught this. Without tracing the source code behind, which seems > quite nested, the above is why I believe the assignment is "delayed"; > traceback() shows a body source code, the object evaluates to > different things depending on interactive(). > > /Henrik > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel -- http://had.co.nz/ ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel