простые вложенные функции и dplyr tidyeval - PullRequest
0 голосов
/ 12 ноября 2018
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? Lexical scope ) две функции, которые я называю child_function и 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
}

Когда я проверяю все это с помощью строки ниже, я получаю "Ошибка в! Переменная: недопустимый тип аргумента" .

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

Полагаю, я не использую правильный синтаксис dplyr. Что не так с моими функциями?

1 Ответ

0 голосов
/ 12 ноября 2018

Требуется небольшая очистка, но теперь она должна работать:

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 туда, где в этом не было необходимости, и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...