如何为R语言R6类自定义print()方法实现差异化输出?
解决方案
你原代码的问题在于,当dt为NULL时调用print(...)会递归调用自定义的print方法,导致无限循环。需要显式调用R6类的默认打印逻辑来输出完整类信息,修改后的代码如下:
library(R6) Simple <- R6Class( "Simple", portable = FALSE, # 允许直接使用dt而非self$dt public = list( x = 1, y = 2, dt = NULL, print = function(...) { if (is.null(self$dt)) { # 调用R6默认的打印方法输出完整类信息 NextMethod() } else { # dt不为空时仅打印dt内容 print(self$dt, ...) } }, date = "2020-10-10" ) ) # 测试效果 s <- Simple$new() s # 输出完整类信息: # <Simple> # Public: # clone: function (deep = FALSE) # date: 2020-10-10 # dt: NULL # print: function (...) # x: 1 # y: 2 s$dt <- mtcars s # 输出mtcars数据集内容
关键说明
NextMethod()会调用R6类的默认打印泛型函数print.R6,从而输出完整的类结构信息,避免递归调用问题。- 即使设置了
portable=FALSE,在print方法中使用self$dt能让代码更清晰,减少作用域歧义。
内容的提问来源于stack exchange,提问作者IVIM
相关产品推荐
相关产品推荐

