stackinator
stackinator

Reputation: 5829

simple nested functions and dplyr tidyeval

library(tidyverse)
set.seed(1)
graph.data <- tibble(cal.date = as.Date(40100:40129, origin = "1899-12-30"), 
                random_num = rnorm(30, 8, 5))

This is the data frame we're working with here.

# A tibble: 30 x 2
   cal.date   random_num
   <date>          <dbl>
 1 2009-10-14       4.87
 2 2009-10-15       8.92
 3 2009-10-16       3.82
 4 2009-10-17      16.0 
 5 2009-10-18       9.65
 6 2009-10-19       3.90
 7 2009-10-20      10.4 
 8 2009-10-21      11.7 
 9 2009-10-22      10.9 
10 2009-10-23       6.47
# ... with 20 more rows

I'm trying to nest(sp? lexical scope) two functions, which I call child_function and parent_function.

child_function <- function(df, variable, hor.line = 6) {  
  variable <- enquo(variable)
  df <- mutate(mutation = 2 * !!variable, horizontal.line = hor.line)
}

parent_function <- function(df, date, variable, hor.line = 6) {
  date <- enquo(date)
  variable <- enquo(variable)
  hor.line <- enquo(hor.line)
  df <- child_function(df, !!variable, !!hor.line) %>% print()
  p <- ggplot(df, aes(date, mutation)) + 
    geom_point() + 
    geom_hline(aes(yintercept = !!hor.line))
  p
}

When I test it all out with the line below I get "Error in !variable : invalid argument type".

parent_function(graph.data, date = cal.date, variable = random_num, hor.line=8)

I imagine I'm not using the proper dplyr tidyeval syntax. What's wrong with my functions?

Upvotes: 5

Views: 379

Answers (1)

arg0naut91
arg0naut91

Reputation: 14774

Needed a bit of a cleanup, but now it should work:

library(tidyverse)
set.seed(1)
graph.data <- tibble(cal.date = as.Date(40100:40129, origin = "1899-12-30"), 
                     random_num = rnorm(30, 8, 5))

child_function <- function(df, variable, hor.line = 6) {  
  variable <- enquo(variable)
  df <- mutate(df, mutation := 2 * !! variable, horizontal.line := hor.line)
}

parent_function <- function(df, date, variable, hor.line = 6) {
  date <- enquo(date)
  variable <- enquo(variable)

  df <- child_function(df, !! variable, hor.line) %>% print()

  p <- ggplot(df, aes(!! date, mutation)) + 
    geom_point() + 
    geom_hline(aes(yintercept = hor.line))
  p
}

parent_function(graph.data, date = cal.date, variable = random_num, hor.line=8)

I think the main issue was that sometimes you put !! or enquo where there was no need and vice versa.

Upvotes: 7

Related Questions