I thought '+' was defined in a more basic level. I usually use CPP. R is
very different from CPP in many basic concepts.

M.


2013/9/12 William Dunlap <wdun...@tibco.com>

> Typo: in
>     environment(fun) <- new.env(parent=parent.env())
> the parent.env() should have been emptyenv().  But, as
> I said, you do not want to do that.
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
>
> > -----Original Message-----
> > From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org]
> On Behalf
> > Of William Dunlap
> > Sent: Thursday, September 12, 2013 3:19 PM
> > To: Gang Peng
> > Cc: r-help@r-project.org
> > Subject: Re: [R] How to avoid searching variables in global environment
> >
> > You can do that with
> >    environment(fun) <- new.env(parent=parent.env())
> > but then your function, function(b)a+b, will not be able
> > to find the "+" function.
> >
> > Putting this code into a package simplifies things a lot.
> >
> > E.g., I added a file containing the two lines
> >    phi <- sum(1/(1:1e6)) - log(1e6) # 0.5772...
> >    fun <- function(b) a + b + phi
> > to a package (and added phi and fun to the NAMESPACE file's export
> > command).  Then R CMD check myPackage reported
> >    * checking R code for possible problems ... Note
> >    fun: no visible binding for global variable 'a'
> > It did not complain about the "+" or "phi", since they are
> > either in the package or in some package required by my
> > package but it did complain about the "a".
> >
> > Furthermore, at runtime, fun will always get phi from the package,
> > even if I happen to have a phi in  my global environment.
> >   > fun(10)
> >   Error in fun(10) : object 'a' not found
> >   > a <- 1000
> >   > fun(10) # uses .GlobalEnv's a
> >   [1] 1010.577
> >   > phi <- 100
> >   > fun(10) # still uses myPackage's phi
> >   [1] 1010.577
> >
> > Bill Dunlap
> > Spotfire, TIBCO Software
> > wdunlap tibco.com
> >
> > From: Gang Peng [mailto:michael.gang.p...@gmail.com]
> > Sent: Thursday, September 12, 2013 2:54 PM
> > To: William Dunlap
> > Cc: Sarah Goslee; r-help@r-project.org
> > Subject: Re: [R] How to avoid searching variables in global environment
> >
> > Hi Bill,
> >
> > Thanks. I think we can define the function in the environment whose
> parent environment
> > is empty environment. But don't know how.
> > Best,
> > Mike
> >
> >
> > 2013/9/12 William Dunlap <wdun...@tibco.com<mailto:wdun...@tibco.com>>
> > If you want to find out if you've forgotten to make 'a' an argument
> > you can use codetools::findGlobals(func) to list the names that don't
> > refer to something already defined in the 'func':
> >   > fun <- function(b) a + b
> >   > library(codetools)
> >   > findGlobals(fun)
> >   [1] "+" "a"
> > You need to filter out things defined in some attached package (like the
> "+"
> > from the base package).  I think that when you run 'R CMD check' on a
> > package this sort of check is made on the functions in the package.
> > findGlobals does not run the function to make its checks, it just looks
> at
> > the function.
> >
> > A kludgy way to get an error message instead of having the function
> silently
> > use something from .GlobalEnv is to make the environment of the function
> > the parent of .GlobalEnv
> >    >  a <- 1000
> >    > environment(fun) <- parent.env(globalenv())
> >    > fun(7)
> >    Error in fun(7) : object 'a' not found
> > Since this is a run-time check it will not find problems in branches of
> the
> > code that are not run.  The parent environment of .GlobalEnv changes
> > every time you attach or detach a package.  For production code you will
> > want to use a package - the namespace mechanism and the check command
> > will take care of most of this sort of problem.
> >
> > Bill Dunlap
> > Spotfire, TIBCO Software
> > wdunlap tibco.com<http://tibco.com>
> >
> >
> > > -----Original Message-----
> > > From: r-help-boun...@r-project.org<mailto:r-help-boun...@r-project.org>
> [mailto:r-
> > help-boun...@r-project.org<mailto:r-help-boun...@r-project.org>] On
> Behalf
> > > Of Sarah Goslee
> > > Sent: Thursday, September 12, 2013 2:09 PM
> > > To: Gang Peng
> > > Cc: r-help@r-project.org<mailto:r-help@r-project.org>
> > > Subject: Re: [R] How to avoid searching variables in global environment
> > >
> > > Hi,
> > >
> > > You need to specify that a is an argument to the function:
> > >
> > > On Thu, Sep 12, 2013 at 3:56 PM, Gang Peng
> > <michael.gang.p...@gmail.com<mailto:michael.gang.p...@gmail.com>> wrote:
> > > > For example:
> > > >
> > > > a <- 1
> > > >
> > > > f <- function(b){
> > > >     return(a+b)
> > > > }
> > > >
> > >
> > > f <- function(b, a) {
> > >     return(a+b)
> > > }
> > >
> > > > when we call function f(2), r will search the local environment
> first, if
> > > > it cannot find a, it will search global environment, and return 3.
> How to
> > > > avoid r searching the global environment and return an error when we
> call
> > > > this function?
> > >
> > > The function will now give an error if a is not specified.
> > >
> > > Sarah
> > >
> > > --
> > > Sarah Goslee
> > > http://www.functionaldiversity.org
> > >
> > > ______________________________________________
> > > R-help@r-project.org<mailto:R-help@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.
> >
> >
> >       [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-help@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.
>

        [[alternative HTML version deleted]]

______________________________________________
R-help@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.

Reply via email to