Подтвердить что ты не робот

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, и он будет делать то же самое. Если я обрезаю количество аргументов, это сработает.

Я подозреваю, что он пытается "to find an inherited method for function ‘foo’ for signature ‘"numeric", "classA", "missing", ...", и это приводит к зависанию R. ЗДЕСЬ - хорошее обсуждение этой темы.

Потому что, если я запускаю тот же код с меньшими параметрами, он работает:

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"))

Почему это происходит? Любые идеи будут оценены.

4b9b3361

Ответ 1

У меня была аналогичная проблема. S4 кажется всевозможными комбинациями подписи. Что замедляет процесс до ползания. Решение состоит в том, чтобы как можно меньше элементов в сигнатуре.

Здесь вы можете найти подробности https://stat.ethz.ch/pipermail/r-devel/2015-May/071092.html