[Rd] how to determine if a function's result is invisible

Duncan Murdoch murdoch at stats.uwo.ca
Thu Oct 26 12:44:06 CEST 2006


On 10/26/2006 6:28 AM, Philippe Grosjean wrote:
> 
>> On 10/26/06, Duncan Murdoch <murdoch at stats.uwo.ca> 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
>>>
>>>




More information about the R-devel mailing list