Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中处理未知方法/泛型_R_Oop_S4_R6 - Fatal编程技术网

如何在R中处理未知方法/泛型

如何在R中处理未知方法/泛型,r,oop,s4,r6,R,Oop,S4,R6,许多语言都有处理未知方法()的特殊方法。我最熟悉的是Python的\uu getattr\uu。如果有人调用您尚未为该类定义的方法,\uuuu getattr\uuuu充当一个包罗万象的角色并执行一些操作 我一直在阅读S4和R6,但我还没有发现如何在R中实现它。这可能吗?不,没有像在python中那样从类定义内部实现这一点的标准方法 在python中,您可以执行类似于MyObject.my_method()的操作,而在R中使用S3或S4时,这将是my_method(MyObject),因此它看起

许多语言都有处理未知方法()的特殊方法。我最熟悉的是Python的
\uu getattr\uu
。如果有人调用您尚未为该类定义的方法,
\uuuu getattr\uuuu
充当一个包罗万象的角色并执行一些操作


我一直在阅读S4和R6,但我还没有发现如何在R中实现它。这可能吗?

不,没有像在python中那样从类定义内部实现这一点的标准方法

在python中,您可以执行类似于
MyObject.my_method()
的操作,而在R中使用S3或S4时,这将是
my_method(MyObject)
,因此它看起来非常像
my_函数(MyObject)
。唯一的区别是,在引擎盖下,您调用的函数将调用分派给适当的方法。为多个类定义这些方法的步骤如下:

mean <- function (x, ...) UseMethod("mean", x)
mean.numeric <- function(x, ...) sum(x) / length(x)
mean.data.frame <- function(x, ...) sapply(x, mean, ...)
mean.matrix <- function(x, ...) apply(x, 2, mean)
mean.default <- function(x, ...) {
  # do something
}

.

张文斯顿在这里提供了大量信息:

他解释了如何为类创建一个S3通用函数
$
,以捕获未知方法。阅读他的完整回复以了解更多详细信息,但关键函数如下(
Counter
是类的名称)


`$.Counter`您想做什么?谢谢!我正确地假设它对S4同样有效?从S3到S4的转换似乎很多。上面的链接(在我的回答中)属于一个处理所有类型OO系统的页面,你会在那里找到很多关于S4的信息,还有一些指向更多信息源的链接。你可以让它适用于S4,但在我看来,对于你想要做的事情,它并不像S3那么简单。我尝试了一下,但现在我很清楚,它可以处理未知的类,而不是未知的方法。在本例中,“mean”是已知的方法,“default”是在类不是数值、data.frame或矩阵的情况下的回退。我真正想要的是,如果有人在我没有平均方法的对象上调用“平均值”,则捕获它。@KyleWard我编辑了我的答案,希望现在清楚了;)这只是重复jkd在回答中所说的不,不是重复jkd的回答。这解决了jkd最后提出的问题,即没有找到相应的字段或方法。
Error in envRefInferField(x, what, getClass(class(x)), selfEnv) : 
  "my_method" is not a valid field or method name for reference class “MyObject”