我想确定一个任意函数是否是一个覆盖泛型函数的S3方法。如果是这样的话,我想将泛型标识为下一步。
问题
我需要类似HasGeneric(AMethod)
的东西来告诉我,我的论点AMethod
是否是一个覆盖某些泛型的方法。或者更好的FindGeneric(AMethod)
,它返回AMethod
的相应泛型。
我的第一个想法是解析函数名,因为推荐使用模式"generic.class“来命名方法。示例:
print
是generic.print.aov
重写S3类aov
.的print
。
但是字符串解析并非没有歧义:all.equal.data.frame
(在dplyr包中)。
此外,这种模式甚至不再是强制性的。看看这个:
a <- 1:5
class(a) <- "SomeTestClassOfMineNotToBeConfused"
# Register some arbitrarily named method as override for print
thisismyaprinter <- function(x) cat("I am A okay")
.S3method("print", "SomeTestClassOfMineNotToBeConfused", thisismyaprinter) # register as override for `print`
methods(class = "SomeTestClassOfMineNotToBeConfused") # now `print` is in the list of methods
#> [1] coerce initialize print show slotsFromS3
#> see '?methods' for accessing help and source code
print(a) # test works, too
#> I am A okay
众所周知,简单向量1:5的输出是:
print(a <- 1:5)
#> [1] 1 2 3 4 5
试用解决方案
我发现的用于研究方法的所有函数都假设我知道泛型或类的名称(但我不知道)。我可以(当然)
使用.knownS3Generics
.
methods()
这不仅是缓慢的。甚至都不起作用。当我在上面的示例中查找print
的方法时,我得到了以下内容:
methods(print)
#> [201] ...
#> [202] print.SomeTestClassOfMineNotToBeConfused*
#> [203] ...
R确实用"generic.class“名称模式注册了该方法。但这是不可能的:
print.SomeTestClassOfMineNotToBeConfused(a)
#> Error in print.SomeTestClassOfMineNotToBeConfused(a): konnte Funktion "print.SomeTestClassOfMineNotToBeConfused" nicht finden
..。这意味着R找不到函数print.SomeTestClassOfMineNotToBeConfused
。
发布于 2022-07-10 11:57:59
您可以使用getDispatchMethodS3
form R.methodsS3
R.methodsS3::getDispatchMethodS3("print" ,
"SomeTestClassOfMineNotToBeConfused")(a)
#> I am A okay
https://stackoverflow.com/questions/72928003
复制相似问题