简单的嵌套函数和dplyr tidyeval

时间:2018-11-12 16:02:49

标签: r function dplyr nested 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))

这是我们在此处使用的数据框。

# 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

我正在尝试嵌套( sp?词法作用域)两个函数,分别称为child_functionparent_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
}

当我用下面的行进行全部测试时,我得到“!variable中的错误:无效的参数类型”。

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

我想我没有使用正确的dplyr tidyeval语法。我的功能出了什么问题?

1 个答案:

答案 0 :(得分:3)

需要一些清理,但是现在应该可以工作了:

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)

我认为主要的问题是有时您将!!enquo放在不需要的地方,反之亦然。