R在setMethod(或setGeneric)中有太多参数时挂起,

基本上,当setMethod或( setGeneric )中有很多参数时,它的工作速度非常慢。

这里是一个基本的例子:

 setClassUnion(name = "mNumeric", members = c("missing", "numeric")) setClass(Class = "classA", representation = representation(ID = "character")) setGeneric("foo", function(r, i, ..., m = 1, D = 1, U = 999, K = 0.005, E1 = -5, E2 = 5, E3 = 1, E4 = 1, E5 = 1, E6 = 1, A1 = -5, A2 = 5, A3 = 1, A4 = 1, A5 = 1, A6 = 1) {standardGeneric ("foo")}) setMethod(f = "foo", signature = c(r = "ANY", i = "classA", m = "mNumeric", D = "mNumeric", U = "mNumeric", K = "mNumeric", E1 = "mNumeric", E2 = "mNumeric", E3 = "mNumeric", E4 = "mNumeric", E5 = "mNumeric", E6 = "mNumeric", A1 = "mNumeric", A2 = "mNumeric", A3 = "mNumeric", A4 = "mNumeric", A5 = "mNumeric", A6 = "mNumeric"), function(r, i, ..., m, D, U, K, E1, E2, E3, E4, E5, E6, A1, A2, A3, A4, A5, A6) {print("Function can made it here..")}) #Program hangs after the following code. (at least five minutes) foo(r = 1, i = new("classA", ID = "ID1")) 

我观察到这与课堂无关。 你可以把一个numeric类放到r ,它也会这样做。 如果我减less参数的数量,它将工作。

我怀疑它试图“ to find an inherited method for function 'foo' for signature '"numeric", "classA", "missing", ... ”,这导致R挂起。 这里是一个很好的讨论这个话题。

因为如果我用较less的参数运行相同的代码,

 setGeneric("foo", function(r, i, ..., m = 1, D = 1, U = 999, K = 0.005, E1 = -5, E2 = 5, E3 = 1, E4 = 1) {standardGeneric ("foo")}) setMethod(f = "foo", signature = c(r = "ANY", i = "classA", m = "mNumeric", D = "mNumeric", U = "mNumeric", K = "mNumeric", E1 = "mNumeric", E2 = "mNumeric", E3 = "mNumeric", E4 = "mNumeric"), function(r, i, ..., m, D, U, K, E1, E2, E3, E4) {print("Function can made it here..")}) foo(r = 1, i = new("classA", ID = "ID1")) 

为什么会发生? 任何想法将不胜感激。

我有一个类似的问题。 S4似乎是签名的所有可能的组合。 这减慢了爬行的速度。 解决scheme是在签名中尽可能less的元素。

你可以在这里find详细信息https://stat.ethz.ch/pipermail/r-devel/2015-May/071092.html