基于传递的参数的通用polimorph函数

时间:2020-02-06 21:07:12

标签: r

我正在寻找一种方法(也许是S3编程),该方法允许此函数根据传递的参数选择一种方法。 我以为定义一个S3类,该函数会选择正确的方法,但是我注意到一组参数不能执行对象的类,因此无法按原样对其进行定义。 我该如何创建这种多态性的逻辑?

library(dplyr)
library(purrr)

sample <- data.frame(
  gp = c("a", "a", "b"),
  claims = c(30, 23, 23),
  workers = c(265, 354, 124),
  DY = c(0, 1, 0)
)

# generic IBNR function

FC_IBNR_TOT <- function(
  claims,
  ...
){
  library(dplyr)

  UseMethod("FC_IBNR_TOT", claims)
}

FC_IBNR_TOT.default <- function(
  claims,
  workers,
  ...
){

  if_else(sum(workers) == 0, 0, sum(claims) / sum(workers) * 12)
}

FC_IBNR_TOT.simple <- function(
  claims,
  workers,
  DY, # develoment year
  FDA = 1.035,
  ...
){

  if_else(
    sum(workers) == 0, 
    0, 
    sum(
      claims * 
        if_else(
          DY == 0, 
          FDA,
          1
        )
    )/ sum(workers) * 12 
  )
}

expected <- sample %>% 
  group_by(
    gp
  ) %>% 
  summarise(
    frec_1 = FC_IBNR_TOT.default(
      claims, workers
    ),
    frec_2 = FC_IBNR_TOT.simple(
      claims, workers, DY
    )
  )

expected

desired <- sample %>% 
  group_by(
    gp
  ) %>% 
  summarise(
    frec_1 = FC_IBNR_TOT(
      claims = claims, workers = workers
    ),
    frec_2 = FC_IBNR_TOT(
      claims = claims, workers = workers, DY = DY
    )
  )

desired

请注意,所需代码始终指向FC_IBNR_TOT.default。 我需要将该函数作为其通用名称FC_IBNR_TOT(而不是FC_IBNR_TOT.defaultFC_IBNR_TOT.simple)调用

1 个答案:

答案 0 :(得分:0)

您必须像这样发送它。 但是,summary()仍然存在问题。 但我无法解决。

 public final class PersistentManager {

    init() {}

    public static let shared = PersistentManager()

    public lazy var persistentContainer: NSPersistentContainer = {

        let container = NSPersistentCloudKitContainer(name: "Event")

        guard let fileContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.event.data") else {
            fatalError("Shared file container could not be created.")
        }

        let storeURL = fileContainer.appendingPathComponent("Event.sqlite")
        let storeDescription = NSPersistentStoreDescription(url: storeURL)
        container.persistentStoreDescriptions = [storeDescription]

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })

        container.viewContext.automaticallyMergesChangesFromParent = true

        do {
            try container.viewContext.setQueryGenerationFrom(.current)
        } catch {
            fatalError("###\(#function): Failed to pin viewContext to the current generation:\(error)")
        }

        return container
    }()

    public lazy var context = persistentContainer.viewContext

    // MARK: - Core Data Saving support
    public  func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {

                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }
}
相关问题