我正在寻找一种方法(也许是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.default
和FC_IBNR_TOT.simple
)调用
答案 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)")
}
}
}
}