S4中setGeneric函数def与useAsDefault参数差异及示例问询
S4 setGeneric 中 def 与 useAsDefault 的差异示例
核心区别
def:主要用于定义泛型函数的参数签名(即函数的输入结构),同时可兼任默认方法的实现(当未指定useAsDefault时)。useAsDefault:专门指定泛型的默认方法实现,优先级高于def中的函数体(当def的函数体为standardGeneric时,必须指定该参数)。
示例1:仅使用 def 参数
此时def的函数体直接作为默认方法:
# 用def定义泛型的同时指定默认行为 setGeneric("mySum", def = function(x, y) { message("调用了def定义的默认方法") x + y }) # 无匹配方法时,执行def的逻辑 mySum(1, 2) # 输出: # 调用了def定义的默认方法 # [1] 3 # 为numeric类型添加专属方法 setMethod("mySum", signature(x = "numeric", y = "numeric"), function(x, y) { message("调用了numeric类型的方法") x + y * 2 }) # 匹配到numeric方法,执行专属逻辑 mySum(1, 2) # 输出: # 调用了numeric类型的方法 # [1] 5
示例2:同时使用 def 和 useAsDefault
这里def仅用来声明参数签名(函数体为standardGeneric),默认方法由useAsDefault指定:
# 先定义独立的默认方法函数 default_my_sum <- function(x, y) { message("调用了useAsDefault指定的默认方法") paste0(x, y) } # def仅定义参数结构,默认实现交给useAsDefault setGeneric("mySum2", def = function(x, y) standardGeneric("mySum2"), useAsDefault = default_my_sum) # 无匹配方法时,执行useAsDefault的逻辑 mySum2("Hello", " World") # 输出: # 调用了useAsDefault指定的默认方法 # [1] "Hello World" # 为integer类型添加专属方法 setMethod("mySum2", signature(x = "integer", y = "integer"), function(x, y) { message("调用了integer类型的方法") x + y * 3 }) # 匹配到integer方法,执行专属逻辑 mySum2(1L, 2L) # 输出: # 调用了integer类型的方法 # [1] 7
错误示例:def 为 standardGeneric 但未指定 useAsDefault
当def的函数体是standardGeneric时,泛型本身没有默认实现,必须通过useAsDefault指定,否则调用时会报错:
setGeneric("badGeneric", def = function(x) standardGeneric("badGeneric")) badGeneric(1) # 报错信息:Error in (function (classes, fdef, mtable) : # unable to find an inherited method for function ‘badGeneric’ for signature ‘"numeric"’
内容的提问来源于stack exchange,提问作者Stefano Borini
相关产品推荐
相关产品推荐

