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" <pda...@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 <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