You can play with the idea by returning an environment that contains delayed assignments. E.g.,
> f <- function(x) { + delayedAssign("eval_date", { cat("Evaluating 'date'\n"); date()}) + delayedAssign("sum_x", { cat("Evaluating 'sum_x'\n"); sum(x)}) + environment() + } > fx <- f(1:10) > date() [1] "Fri Oct 28 14:22:12 2022" > Sys.sleep(2) > fx$eval_date Evaluating 'date' [1] "Fri Oct 28 14:22:24 2022" > Sys.sleep(2) > fx$eval_date [1] "Fri Oct 28 14:22:24 2022" > fx$sum_x Evaluating 'sum_x' [1] 55 > fx$sum_x [1] 55 -Bill On Fri, Oct 28, 2022 at 2:11 PM Gabriel Becker <gabembec...@gmail.com> wrote: > Hi Dipterix, > > > On Fri, Oct 28, 2022 at 1:10 PM Dipterix Wang <dipterix.w...@gmail.com> > wrote: > > > Hi, > > > > I was wondering if it is a good idea to delay the evaluation of > expression > > within invisible(), just like data()/delayedAssign()? > > > > The idea is a function might return an invisible object. This object > might > > not be used by the users if the function returns are not assigned nor > > passed to another function call. For example, > > > > f <- function() { > > # do something eagerly > > > > return(invisible({ > > # calculate message that might take long/extra memory, but only > useful > > if printed out > > })) > > } > > > > If `f()` is not immediately assigned to a variable, then there is no > > reason to evaluate invisible(…). > > > > This is not quite true. The value, even when invisible, is captured by > .Last.value, and > > > f <- function() invisible(5) > > > f() > > > .Last.value > > [1] 5 > > > Now that doesn't actually preclude what you're suggesting (just have to > wait for .Last.value to be populated by something else), but it does > complicate it to the extent that I'm not sure the benefit we'd get would be > worth it. > > Also, in the case you're describing, you'd be pushing the computational > cost into printing, which, imo, is not where it should live. Printing a > values generally speaking, should just print things, imo. > > That said, if you really wanted to do this, you could approach the behavior > you want, I believe (but again, I think this is a bad idea) by returning a > custom class that wraps formula (or, I imagine, tidyverse style quosures) > that reach back into the call frame you return them from, and evaluating > them only on demand. > > Best, > ~G > > > > This idea is somewhere between `delayedAssign` and eager evaluation. > Maybe > > we could call it delayedInvisible()? > > > > Best, > > - Zhengjia > > > > ______________________________________________ > > R-devel@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-devel > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel