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.

Reply via email to