On 10/26/2006 6:28 AM, Philippe Grosjean wrote: > >> On 10/26/06, Duncan Murdoch <[EMAIL PROTECTED]> wrote: > [...] >>> Actually, there is a way, but it's undocumented (i.e., use at your own >>> risk). It's the eval.with.vis function. This is an internal function > > Yes... and there are three problems here: > 1) To spot the undocumented function one is looking for, > 2) To figure out how to use it, > 3) To rewrite your code regularly if you maintain packages that use > several of such undocumented functions. This is the case of many R GUI > projects... and one reason why staying up-to-date with the new versions > of R (every 6 months) is a nightmare for these GUIs!
Those are definitely real problems. At the last useR meeting, Thomas Baier made an excellent suggestion: someone should put together an API specifically for R GUIs. I think eval.with.vis would have to be part of such an API; there are dozens of other currently undocumented or unavailable functions as well. This is a difficult project, because it would have to get agreement on what should be part of the API, and that will constrain future changes: so there would be a lot of resistance to making it too constraining. It will need to be flexible, so that R isn't required to supply services that don't make sense in all contexts. Duncan Murdoch > For instance, I use eval.with.vis() in the latest version of svSockets > package in the SciViews bundle, but I am afraid to release it on CRAN > because I know of the nightware I will face if this function (silently) > changes its behavior in subsequent versions of R. > > I guess there is no solution to this problem, since there is certainly a > good reason for keeping portions of R code undocumented (and thus > flagged as :" use-it-at-your-own-risk!"), but it does not eases our life! > > Best, > > Philippe Grosjean > >>> that is used within source() and capture.output(); you'll have to guess >>> from the usage there what the args are. But here's an F that does >>> something close to what you want: >>> >>> > fix(F) >>> > f <- function() 1 >>> > g <- function() invisible(1) >>> > >>> > F <- function (expr) >>> + { >>> + expr <- substitute(expr) >>> + pf <- parent.frame() >>> + tmp <- .Internal(eval.with.vis(expr, pf, >>> + baseenv())) >>> + tmp >>> + } >>> > F(f()) >>> $value >>> [1] 1 >>> >>> $visible >>> [1] TRUE >>> >>> > F(g()) >>> $value >>> [1] 1 >>> >>> $visible >>> [1] FALSE >>> >>> ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel