The tricky part about your example is that each of the arguments in "..." could be originating from different frames.
The S4Vectors:::top_prenv_dots function will give you a list of environments, one for each argument in "...". An example of its use can be found in IRanges::transform.DataTable. I bet top_prenv_dots will be moving to a different package soon, so don't get too attached to anything. Michael On Wed, Apr 23, 2014 at 11:02 AM, Kevin Ushey <kevinus...@gmail.com> wrote: > Hi everyone, > > I'm trying to investigate lazy evaluation with S4, and specifically > the environment chain available for lookup when an S4 method is > evaluated. > > With 'vanilla' R functions, we can write something like the following: > > lazy <- function(...) { > call <- substitute(list(...)) > for (i in 2:length(call)) { > eval(call[[i]]) > } > } > > and evaluation will succeed if this function is called by another function: > > f <- function() { > var <- 10 > lazy(x = var) > } > > f() > > The evaluation of the symbol 'var' is able to find it in the 'f' > environment. > > setClass("Lazy", list(data="list")) > setGeneric("lazy", function(x, ...) standardGeneric("lazy")) > setMethod("lazy", list(x="Lazy"), function(x, ...) { > call <- substitute(list(...)) > for (i in 2:length(call)) { > eval( call[[i]] ) > } > }) > > f <- function() { > var <- new("Lazy", data=list(1)) > y <- 1 > cat("\n") > lazy(var, a=y) > } > > f() > > gives ' Error in eval(expr, envir, enclos) : object 'y' not found '. > It seems like the S4 method is evaluated in an environment detached > from the scope of the caller (which is probably outlined in ?Methods, > but I am having trouble parsing everything in there). > > My main question is -- is there a nice way to work around this, in a > way that is transparent to the user of a function? > > Further motivation available in the GitHub issue for flowCore here: > https://github.com/RGLab/ncdfFlow/issues/31 > > Thanks, > Kevin > > _______________________________________________ > Bioc-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/bioc-devel > [[alternative HTML version deleted]] _______________________________________________ Bioc-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/bioc-devel