[R] formula argument evaluation

Adrian Dușa dusa.adrian at unibuc.ro
Thu Apr 14 19:00:39 CEST 2016


Thanks Bill, it's very useful to know how parsing and evaluation works.
It seems that quoting is the least complicated solution which is guaranteed
to work.

Best,
Adrian
On 13 Apr 2016 6:04 p.m., "William Dunlap" <wdunlap at tibco.com> wrote:

> %=>% would have precendence ('order of operations') problems also.
>
>    A + B %=>% C
>
> is equivalent to
>
>   A + ( B %=>% C)
>
> and I don't think that is what you want.
>
> as.list(quote(A + B %=>% C)) shows the first branch in the parse tree.
> The following function, str.language, shows the entire parse tree, as in
>
>   > str.language(quote(A + B %=>% C))
>   `quote(A + B %=>% C)` call(3): A + B %=>% C
>     `` name(1): +
>     `` name(1): A
>     `` call(3): B %=>% C
>       `` name(1): %=>%
>       `` name(1): B
>       `` name(1): C
>
> str.language <-
> function (object, ..., level = 0, name = myDeparse(substitute(object)))
> {
>     abbr <- function(string, maxlen = 25) {
>         if (length(string) > 1 || nchar(string) > maxlen)
>             paste(substring(string[1], 1, maxlen), "...", sep = "")
>         else string
>     }
>     myDeparse <- function(object) {
>         if (!is.environment(object)) {
>             deparse(object)
>         }
>         else {
>             ename <- environmentName(object)
>             if (ename == "")
>                 ename <- "<unnamed env>"
>             paste(sep = "", "<", ename, "> ", paste(collapse = " ",
>                 objects(object)))
>         }
>     }
>     cat(rep("  ", level), sep = "")
>     if (is.null(name))
>         name <- ""
>     cat(sprintf("`%s` %s(%d): %s\n", abbr(name), class(object),
>         length(object), abbr(myDeparse(object))))
>     a <- attributes(object)
>     if (is.recursive(object) && !is.environment(object)) {
>         object <- as.list(object)
>         names <- names(object)
>         for (i in seq_along(object)) {
>             str.language(object[[i]], ..., level = level + 1,
>                 name = names[i])
>         }
>     }
>     a$names <- NULL
>     if (length(a) > 0) {
>         str.language(a, level = level + 1, name = paste("Attributes of",
>             abbr(name)))
>     }
> }
>
>
>
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
>
> On Tue, Apr 12, 2016 at 11:59 PM, Adrian Dușa <dusa.adrian at unibuc.ro>
> wrote:
>
>> I suppose it would work, although "=>" is rather a descriptive symbol and
>> less a function.
>> But choosing between quoting:
>> "A + B => C"
>> and a regular function:
>> A + B %=>% C
>> probably quoting is the most straightforward, as the result of the foo()
>> function has to be a string anyways (which is parsed by other functions).
>>
>> On Tue, Apr 12, 2016 at 6:20 PM, Richard M. Heiberger <rmh at temple.edu>
>> wrote:
>>
>> > Would making it regular function %=>%, using "%" instead of quotes,
>> > work for you?
>> >
>> > On Tue, Apr 12, 2016 at 11:09 AM, Adrian Dușa <dusa.adrian at unibuc.ro>
>> > wrote:
>> > > On Tue, Apr 12, 2016 at 2:08 PM, Duncan Murdoch <
>> > murdoch.duncan at gmail.com>
>> > > wrote:
>> > >> [...]
>> > >>
>> > >> It never gets to evaluating it.  It is not a legal R statement, so
>> the
>> > > parser signals an error.
>> > >> If you want to pass arbitrary strings to a function, you need to put
>> > them
>> > > in quotes.
>> > >
>> > > I see. I thought it was parsed inside the function, but if it's parsed
>> > > before then quoting is the only option.
>> > >
>> > >
>> > > To Keith: no, I mean it like this "A + B => C" which is translated as:
>> > > "the union of A and B is sufficient for C" in set theoretic language.
>> > >
>> > > The "=>" operator means sufficiency, while "<=" means necessity.
>> Quoting
>> > > the expression is good enough, I was just curious if the quotes could
>> be
>> > > made redundant, somehow.
>> > >
>> > > Thank you both,
>> > > Adrian
>> > >
>> > > --
>> > > Adrian Dusa
>> > > University of Bucharest
>> > > Romanian Social Data Archive
>> > > Soseaua Panduri nr.90
>> > > 050663 Bucharest sector 5
>> > > Romania
>> > >
>> > >         [[alternative HTML version deleted]]
>> > >
>> > > ______________________________________________
>> > > R-help at 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.
>> >
>>
>>
>>
>> --
>> Adrian Dusa
>> University of Bucharest
>> Romanian Social Data Archive
>> Soseaua Panduri nr.90
>> 050663 Bucharest sector 5
>> Romania
>>
>>         [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at 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]]



More information about the R-help mailing list