【问题标题】:simple nested functions and dplyr tidyeval简单的嵌套函数和 dplyr tidyeval
【发布时间】:2019-04-15 09:26:31
【问题描述】:
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
}

当我用下面的行测试它时,我得到 "Error in !variable : invalid argument type"

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

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

【问题讨论】:

    标签: r function dplyr nested tidyeval


    【解决方案1】:

    需要进行一些清理,但现在应该可以了:

    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 放在不需要的地方,反之亦然。

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2016-04-21
      • 2014-04-10
      相关资源
      最近更新 更多