代码之家  ›  专栏  ›  技术社区  ›  stackinator Brenton Wiernik

简单嵌套函数和dplyr tidyeval

  •  2
  • stackinator Brenton Wiernik  · 技术社区  · 7 年前
    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
    

    服务提供商?词汇范围 )两个函数,我称之为 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 tidyeval语法。我的函数有什么问题?

    1 回复  |  直到 7 年前
        1
  •  5
  •   arg0naut91    7 年前

    需要一点清理,但现在应该可以了:

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

    推荐文章