[R] Display warning only once in session

William Dunlap wdunlap at tibco.com
Tue Aug 26 02:38:12 CEST 2014


> Is local preferred to prevent *any* access to the internal environment
> of the returned function?

You can gain access to the environment of the function by using
environment(myFunc), with either local() or your suggestion of
making a factory function and calling it.

> How is it different than this?
>
> myFunc <- function() {
>     notWarnedYet <- TRUE
>     function(x) {
>         if (notWarnedYet) {
>             warning("myFunc is funky")
>             notWarnedYet <<- FALSE # note use of <<-
>         }
>         sqrt(log2(x))
>     }
> }

That function, when called, would return a function that warned just
once; it is not a function that warns just once.  You could call it
myFuncFactory and make myFunc itself with myFunc <- myFuncFactory().
That would be equivalent to my example calling local().  The factory
approach is good for making a series of functions, each with its own
state (say counters or random number generators).  local() is
convenient for singleton functions-with-state.  You can also supply an
environment to local() so you can make a set of functions sharing a
common environment.  I think reference classes encapsulate both of
these cases.

Bill Dunlap
TIBCO Software
wdunlap tibco.com


On Mon, Aug 25, 2014 at 5:15 PM, Grant Rettke <gcr at wisdomandwonder.com> wrote:
> Is local preferred to prevent *any* access to the internal environment
> of the returned function?
>
> How is it different than this?
>
> myFunc <- function() {
>     notWarnedYet <- TRUE
>     function(x) {
>         if (notWarnedYet) {
>             warning("myFunc is funky")
>             notWarnedYet <<- FALSE # note use of <<-
>         }
>         sqrt(log2(x))
>     }
> }
> Grant Rettke | ACM, ASA, FSF, IEEE, SIAM
> gcr at wisdomandwonder.com | http://www.wisdomandwonder.com/
> “Wisdom begins in wonder.” --Socrates
> ((λ (x) (x x)) (λ (x) (x x)))
> “Life has become immeasurably better since I have been forced to stop
> taking it seriously.” --Thompson
>
>
> On Mon, Aug 25, 2014 at 4:50 PM, William Dunlap <wdunlap at tibco.com> wrote:
>> You could use local() to associate a state variable with your function:
>>    myFunc <- local({
>>        notWarnedYet <- TRUE
>>        function(x) {
>>            if (notWarnedYet) {
>>                warning("myFunc is funky")
>>                notWarnedYet <<- FALSE # note use of <<-
>>            }
>>            sqrt(log2(x))
>>       }
>>    })
>> E.g.,
>>    > myFunc(1:5)
>>    [1] 0.000000 1.000000 1.258953 1.414214 1.523787
>>    Warning message:
>>    In myFunc(1:5) : myFunc is funky
>>    > myFunc(1:5)
>>    [1] 0.000000 1.000000 1.258953 1.414214 1.523787
>>    > myFunc(1:5)
>>    [1] 0.000000 1.000000 1.258953 1.414214 1.523787
>>
>> Bill Dunlap
>> TIBCO Software
>> wdunlap tibco.com
>>
>>
>> On Mon, Aug 25, 2014 at 2:05 PM, Berry Boessenkool
>> <berryboessenkool at hotmail.com> wrote:
>>>
>>> Hi,
>>>
>>> I'm writing a function that gives a warning in a certain scenario.
>>> Reading this once per R session will be enough.
>>> i.e. it's not necessary to be shown in subsequent function calls.
>>>
>>> What's the best way to implement this?
>>> Some package-specific option?
>>> Where would I find good information on that?
>>>
>>> searching with the keywords I'm using as the subject of this message didn't dig up any results.
>>> Maybe it will be enough to give me some better keywords...
>>>
>>> Thanks ahead,
>>> Berry
>>>
>>> RclickHandbuch.wordpress.com
>>>
>>>
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list