代码之家  ›  专栏  ›  技术社区  ›  landau

扩展tibble:让新的S3类保持不变

  •  0
  • landau  · 技术社区  · 8 年前

    为了 ropensci/drake#489 ,我想为 tibbles 阶级的 "drake_plan" . 我读了 guide on extending tibble ,这对某些需求很有帮助。但是新的 “德雷克计划” S3课程在 dplyr 操作。

    #' @title Mark a data frame as a `drake` workflow plan
    #' @description Used for pretty printing only (coming soon).
    #'   You do not actually have to mark plans as such.
    #'   You can keep them as ordinary data frames.
    #' @export
    #' @keywords internal
    #' @param x object to mark as a `drake` plan
    #' @param ... other arguments to the method
    #' @examples
    #' plan <- list(target = "x", command = "get_data()")
    #' class(plan)
    #' plan <- as_drake_plan(plan)
    #' class(plan)
    as_drake_plan <- function(x){
      UseMethod("as_drake_plan")
    }
    
    as_drake_plan_ <- function(x, ...){
      tibble::new_tibble(x, ..., subclass = "drake_plan")
    }
    
    #' @export
    `[.drake_plan` <- function(...){
      as_drake_plan_(NextMethod())
    }
    
    #' @export
    #' @rdname as_drake_plan
    as_drake_plan.data.frame <- as_drake_plan_
    
    #' @export
    #' @rdname as_drake_plan
    as_drake_plan.list <- as_drake_plan_
    
    #' @export
    #' @rdname as_drake_plan
    as_drake_plan.tbl_df <- as_drake_plan_
    
    library(dplyr)
    library(drake)
    plan <- drake_plan(
      x = get_data(),
      y = analyze_data(x)
    ) %>%
      as_drake_plan() %>%
      print
    #> # A tibble: 2 x 2
    #>   target command        
    #> * <chr>  <chr>          
    #> 1 x      get_data()     
    #> 2 y      analyze_data(x)
    class(plan)
    #> [1] "drake_plan" "tbl_df"     "tbl"        "data.frame"
    filter(plan, target == "x") %>%
      class()
    #> [1] "tbl_df"     "tbl"        "data.frame"
    

    而且 dplyr公司 函数,是否有其他情况可以从 藏 s?

    1 回复  |  直到 8 年前
        1
  •  1
  •   landau    8 年前

    我刚发现这已经记录在 dplyr 开发页: https://github.com/tidyverse/dplyr/issues/2532 . 显然,我们没有计划 tibble 子类。