Skip to content

quote()/eval() question

3 messages · Axel Urbiz, Duncan Murdoch, David Winsemius

#
Dear list,

For a reason it would take me long to explain, I need to do something along
the lines of what's shown below -- i.e., create an object from
dplyr::summarise, and then evaluate it on a data frame.

I know I could directly do:

 df %>% dplyr::summarise(x1_mean = mean(x1))

but this is not what I'm looking for.


library(dplyr)

df <- data.frame(x1 = rnorm(100), x2 = rnorm(100))

foo <- function(df) {

  mySummary <- quote(dplyr::summarise(x1_mean = mean(x1)))

  df %>% eval(mySummary)

}

foo(df)

Error in eval(., mySummary) : invalid 'envir' argument of type 'language'

Thank you,
Axel.
#
On 08/09/2017 7:55 PM, Axel Urbiz wrote:
magrittr pipes are just syntactic sugar.  What your second line does is 
the same as

eval(df, mySummary)

which makes no sense.  These would work:

eval(df, expr = mySummary)
eval(mySummary, envir = df)

You could write the first as

df %>% eval(expr = mySummary)

and the second as

df %>% eval(mySummary, envir = .)

Duncan Murdoch
#
You might get a more informative error message if you didn't use `df` as your local variable. It's the name of a function.