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

Golden, Shelby Go|denS @end|ng |rom NJHe@|th@org
Fri Sep 6 23:30:46 CEST 2019

```Afternoon, David,

Thank you for your suggestions and insight. I have previously utilized parse, but in my exploration to improve my coding technique I came across this comment in stackoverflow.com (https://stackoverflow.com/questions/1743698/evaluate-expression-given-as-a-string - comment left Martin Maechler). In it, he suggests that usage parse is not a good method, saying that it is "rarely an efficient or safe means to construct expressions (or calls)".

Perhaps you, or others in this community, disagree with what Martin has to say about parse in this application?

Shelby

﻿On 9/6/19, 3:10 PM, "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,
>      > >>
>      > >> 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
>      > >> 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
>      > >> >
>      > >> 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
>      > >> 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
>      > 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
>      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