[R] [R-devel] Source Code for function

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Sat Sep 7 00:50:56 CEST 2019


It is time to end these queries and start your homework by consulting the
references you have already been given. Wickham's goes into all of this;
the R Language Definition that ships with R covers all of your questions
and more in detail; and numerous online references and tutorials -- A
search on "what is a promise in R" brings up numerous resources, for
example -- are available.

This list is for help. It is not a substitute for studying on your own.

Cheers,
Bert

On Fri, Sep 6, 2019 at 3:15 PM Golden, Shelby <GoldenS using njhealth.org> wrote:

> Afternoon, Peter,
>
> Thank you for your concise but informative reply, and for a link to the
> source code. These complex concepts do answer my question spot on, so thank
> you for taking the time to put them all together and summarizing them for
> me.
>
> Is the standard nomenclature for arguments in function calls "promises"? I
> would like to look into this concept further. If there are other concepts
> you think I should look into further too, I would be happy to include those
> as well.
>
> Regards,
> Shelby
>
>
> On 9/6/19, 4:02 PM, "peter dalgaard" <pdalgd using gmail.com> wrote:
>
>     Um... Let's get the concepts straight:
>
>     The "function" function doesn't evaluate anything. It just takes the
> list of formal arguments (including default expressions), the function
> body, and the current evaluation environment, and stiches them together
> into a function object, known as a "closure".
>
>     The action happens when a function is _called_. Then the actual
> arguments are combined with the formals, and the body expression is
> evaluated. You will find the source code for this in src/main/eval.c. It is
> a pretty complex beast, but the essential point for the present discussion
> is that actual arguments in function calls are passed in the form of
> so-called promises. These contain the expression passed, so that
> substitute() can extract it. It also enables lazy evaluation: putting off
> argument evaluation until the value is actually needed (possibly never).
>
>     -pd
>
>     > On 6 Sep 2019, at 23:10 , David Winsemius <dwinsemius using comcast.net>
> wrote:
>     >
>     >
>     > On 9/6/19 1:07 PM, Golden, Shelby wrote:
>     >> Thank you all for your reply. I should clarify, that I am looking
> to understand why the keyword function can take a logical argument (eg:
> x<4) and use that later inside the function's definition for logical
> evaluations.
>     >>
>     >> Consider this example, which is a simplification of
> getAnywhere(subset.data.frame):
>     >> x = data.frame("Col1" = c(1, 2, 3, 4, 5), "Col2" = c(6, 7, 8, 9,
> 10))
>     >> test <- function(x, logic){
>     >>  e <- substitute(logic)
>     >>  r <- eval(e, x, parent.frame())
>     >>  r[r]
>     >> }
>     >
>     > x<4 is not really a logical argument in that context. It is rather
> an expression and will remain an expression until it needs to be evaluated.
> See this even simpler example:
>     >
>     >
>     >  test <- function(x, logic, ... ){
>     >      e <- deparse( substitute(logic))
>     >      #r <- eval(e, x, parent.frame())
>     >      e
>     >  }
>     >  test(4, x<4)
>     > #[1] "x < 4"
>     >
>     >
>     >  test(4, is.logical(x < 4) )
>     > [1] "is.logical(x < 4)"
>     >
>     >
>     > Some of this you have already been told, but appears necessary to
> repeat. Expressions given to `function` are not necessarily evaluated. They
> will be evaluated if assigned names.
>     >
>     >
>     > test(4, zed = is.logical(x < 4) )
>     > #[1] ""
>     >
>     > The function()-function will parse the contents of the parentheses
> for number of arguments and for parse()-ability. It will evaluate named
> arguments created with "=". In the context of parsing the formals of a
> function the "=" operator is different than the "<-" function.
>     >
>     > The substitute function will not evaluate (since in the language of
> R operations it is "special"), but rather checks that the expression can be
> parsed by R's rules, i.e. is a valid parse tree. `deparse` returns the
> original character representation.
>     >
>     > --
>     >
>     > David
>     >
>     >
>     >>
>     >> Shelby
>     >>
>     >> On 9/6/19, 1:02 PM, "R-help on behalf of Richard M. Heiberger" <
> r-help-bounces using r-project.org on behalf of rmh using temple.edu> wrote:
>     >>
>     >>     You might also want to look at the codetools package, for
> example the
>     >>     showTree function " Prints a Lisp-style representation of R
>     >>     expression."
>     >>          > library(codetools)
>     >>          > showTree(quote(x %*% x))
>     >>     (%*% x x)
>     >>     > showTree(quote(a+b))
>     >>     (+ a b)
>     >>     > showTree(quote(y ~ a+b))
>     >>     (~ y (+ a b))
>     >>          On Fri, Sep 6, 2019 at 2:30 PM Bert Gunter <
> bgunter.4567 using gmail.com> wrote:
>     >>     >
>     >>     > The following may be of use (it gives the parse tree of the
> text):
>     >>     >
>     >>     > > z <- as.list(parse(text = "function(x)x %*% x"))
>     >>     > > z[[1]]
>     >>     > function(x) x %*% x
>     >>     > > z[[c(1,1)]]
>     >>     > `function`
>     >>     > > z[[c(1,2)]]
>     >>     > $x
>     >>     > > z[[c(1,3)]]
>     >>     > x %*% x
>     >>     > > z[[c(1,3,1)]]
>     >>     > `%*%`
>     >>     > > z[[c(1,3,2)]]
>     >>     > x
>     >>     > > z[[c(1,3,3)]]
>     >>     > x
>     >>     >
>     >>     >
>     >>     > Bert Gunter
>     >>     >
>     >>     >
>     >>     >
>     >>     > On Fri, Sep 6, 2019 at 10:14 AM Wang Jiefei <
> szwjf08 using gmail.com> wrote:
>     >>     >
>     >>     > > If you are looking for an R code parser, I think the
> `parse` and `eval`
>     >>     > > function might be a good start point. See the example below.
>     >>     > >
>     >>     > > > parse(text="function(x)message(x)")
>     >>     > > expression(function(x)message(x))
>     >>     > > > eval(parse(text="function(x)message(x)"))
>     >>     > > function(x)message(x)
>     >>     > >
>     >>     > > Best,
>     >>     > > Jiefei
>     >>     > >
>     >>     > > On Fri, Sep 6, 2019 at 12:55 PM Golden, Shelby <
> GoldenS using njhealth.org>
>     >>     > > wrote:
>     >>     > >
>     >>     > >> Hello Bert,
>     >>     > >>
>     >>     > >> Thank you for the reply and your clarifications. Yes, it
> might be helpful
>     >>     > >> to look into R’s formal grammar to see how “function”
> parses input to
>     >>     > >> delegate correct syntax. Is that accessible online?
>     >>     > >>
>     >>     > >> Thank you,
>     >>     > >> Shelby
>     >>     > >>
>     >>     > >>
>     >>     > >> From: Bert Gunter <bgunter.4567 using gmail.com>
>     >>     > >> Date: Friday, September 6, 2019 at 10:44 AM
>     >>     > >> To: "Golden, Shelby" <GoldenS using NJHealth.org>
>     >>     > >> Cc: "r-help using R-project.org" <r-help using r-project.org>,
> "Gillenwater, Lucas" <
>     >>     > >> GILLENWATERL using NJHEALTH.ORG>
>     >>     > >> Subject: Re: [R] [R-devel] Source Code for function
>     >>     > >>
>     >>     > >> 1. This is a plain text list; all html is stripped. So
> there is no red
>     >>     > >> highlighting.
>     >>     > >>
>     >>     > >> 2. There is no "source code" for "function" -- it is a
> reserved keyword.
>     >>     > >> Or are you looking for R's formal grammar -- e.g. how it
> parses input to
>     >>     > >> determine correct syntax?
>     >>     > >>
>     >>     > >>
>     >>     > >>
>     >>     > >> Bert Gunter
>     >>     > >>
>     >>     > >> "The trouble with having an open mind is that people keep
> coming along
>     >>     > >> and sticking things into it."
>     >>     > >> -- Opus (aka Berkeley Breathed in his "Bloom County" comic
> strip )
>     >>     > >>
>     >>     > >>
>     >>     > >> On Fri, Sep 6, 2019 at 8:51 AM Golden, Shelby <
> GoldenS using njhealth.org
>     >>     > >> <mailto:GoldenS using njhealth.org>> wrote:
>     >>     > >> Hi all,
>     >>     > >>
>     >>     > >> I have been attempting to access the source code for the
> keyword
>     >>     > >> “function” to better understand how it assigns and stores
> logical inputs,
>     >>     > >> like in the subset() [base] function. Does anyone know how
> I can access the
>     >>     > >> source code for this?
>     >>     > >>
>     >>     > >> For example, if I have
>     >>     > >> norm <- function(x){
>     >>     > >>       sqrt(x%*%x))
>     >>     > >> }
>     >>     > >> I am looking for the source code for the “function”
> portion, highlighted
>     >>     > >> in red.
>     >>     > >>
>     >>     > >> Thank you for your time and assistance,
>     >>     > >> Shelby Golden
>     >>     > >> Lab Researcher Technician
>     >>     > >> Dr. Russell Bowler’s Lab
>     >>     > >> Department of Medicine
>     >>     > >> National Jewish Health in Denver, CO
>     >>     > >> Phone: (303) 270-2598
>     >>     > >>
>     >>     > >> NOTICE: This email message is for the sole use of the
> intended
>     >>     > >> recipient(s) and may contain confidential and privileged
> information. Any
>     >>     > >> unauthorized review, use, disclosure or distribution is
> prohibited. If you
>     >>     > >> are not the intended recipient, please contact the sender
> by reply email
>     >>     > >> and destroy all copies of the original message.
>     >>     > >>         [[alternative HTML version deleted]]
>     >>     > >>
>     >>     > >> ______________________________________________
>     >>     > >> R-help using r-project.org<mailto:R-help using r-project.org> mailing
> list -- To
>     >>     > >> UNSUBSCRIBE and more, see
>     >>     > >> https://stat.ethz.ch/mailman/listinfo/r-help<
>     >>     > >>
> http://mx2.njhealth.org:32224/?dmVyPTEuMDAxJiZmMWRiYmMxZjFmNmI5ZDBkMz01RDcyOEQwN18yMjk2OF8zOTk2XzEmJjljNzlmMDA4YWRmZTZjMz0xMjMzJiZ1cmw9aHR0cHMlM0ElMkYlMkZzdGF0JTJFZXRoeiUyRWNoJTJGbWFpbG1hbiUyRmxpc3RpbmZvJTJGci1oZWxw
>     >>     > >> >
>     >>     > >> PLEASE do read the posting guide
>     >>     > >> http://www.R-project.org/posting-guide.html<
>     >>     > >>
> http://mx2.njhealth.org:32224/?dmVyPTEuMDAxJiZlMTkwYmMwMzFlNjk4ZTAzNz01RDcyOEQwN18yMjk2OF8zOTk2XzEmJmFkYTkxMWRkMWRhZTFkNz0xMjMzJiZ1cmw9aHR0cCUzQSUyRiUyRnd3dyUyRVItcHJvamVjdCUyRW9yZyUyRnBvc3RpbmctZ3VpZGUlMkVodG1s
>     >>     > >> >
>     >>     > >> and provide commented, minimal, self-contained,
> reproducible code.
>     >>     > >>
>     >>     > >>         [[alternative HTML version deleted]]
>     >>     > >>
>     >>     > >> ______________________________________________
>     >>     > >> R-help using r-project.org mailing list -- To UNSUBSCRIBE and
> more, see
>     >>     > >> 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 using r-project.org mailing list -- To UNSUBSCRIBE and
> more, see
>     >>     > 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 using r-project.org mailing list -- To UNSUBSCRIBE and more,
> see
>     >>     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.
>     >>
>     >>
>     >> NOTICE: This email message is for the sole use of the intended
> recipient(s) and may contain confidential and privileged information. Any
> unauthorized review, use, disclosure or distribution is prohibited. If you
> are not the intended recipient, please contact the sender by reply email
> and destroy all copies of the original message.
>     >> ______________________________________________
>     >> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>     >> 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 using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>     > 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.
>
>     --
>     Peter Dalgaard, Professor,
>     Center for Statistics, Copenhagen Business School
>     Solbjerg Plads 3, 2000 Frederiksberg, Denmark
>     Phone: (+45)38153501
>     Office: A 4.23
>     Email: pd.mes using cbs.dk  Priv: PDalgd using gmail.com
>
>
>
>
>
>
>
>
>
>
>
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list