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 <dwinsem...@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-boun...@r-project.org on behalf of r...@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.4...@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 <szwj...@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 <gold...@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.4...@gmail.com> >> > >> Date: Friday, September 6, 2019 at 10:44 AM >> > >> To: "Golden, Shelby" <gold...@njhealth.org> >> > >> Cc: "r-help@R-project.org" <r-help@r-project.org>, "Gillenwater, >> Lucas" < >> > >> gillenwat...@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 <gold...@njhealth.org >> > >> <mailto:gold...@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@r-project.org<mailto:R-help@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@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@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@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@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@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....@cbs.dk Priv: pda...@gmail.com ______________________________________________ R-help@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.