如何在R包中对%*%、%x%等中缀运算符实现S3方法分发
问题原因
R 中仅部分内置运算符默认被注册为S3内部泛型(例如+、-、[等),%*%以及其他%包裹的内置运算符本身是原始函数,但默认未开启S3分发逻辑,因此直接定义%*%.custom这类带类后缀的方法不会被自动匹配调用。
解决方案
手动将%*%注册为S3泛型,同时设置默认方法回退到base包的原生实现即可。后续自定义类的运算符方法就可以和+一样走原生S3分发,不需要手动编写类判断分支。
该方案同样适用于其他需要重载的内置%开头运算符。
完整实现代码
# 注册%*%为S3泛型 `%*%` <- function(x, y) { UseMethod("%*%") } # 设置默认方法,非自定义类时调用原生实现 `%*%.default` <- function(x, y) { base::`%*%`(x, y) } # 自定义custom类的%*%方法 `%*%.custom` <- function(x, y) { return(as.numeric(x) + as.numeric(y) + 1) } # 测试效果 x <- 1:5 y <- 6:10 class(x) <- "custom" class(y) <- "custom" # 自定义类调用对应重载方法 x %*% y # [1] 8 10 12 14 16 # 普通数值类调用原生实现 as.numeric(x) %*% as.numeric(y) # [,1] # [1,] 130
R包开发注意事项
如果是在R包中实现该逻辑,需要在NAMESPACE中导出你定义的%*%泛型,用户加载你的包后即可自动适配S3分发逻辑,不会影响其他类对%*%的正常调用。
内容的提问来源于stack exchange,提问作者Shixiang Wang
相关产品推荐
相关产品推荐

