Блок-схема с использованием {diagram} в R 3.0.0 для Windows


Я пытаюсь воссоздать блок-схему в R, используя пакет диаграмм (v 1.6). Я смог сделать диаграмму, используя этот точный скрипт (который я изменил из примера в документации по диаграмме), но как только я обновил R до 3.0.0, функция координат дает мне ошибку. Вот пример:

library(graphics)
library(diagram)

par(mar = c(1, 1, 1, 1))
openplotmat()
elpos<-coordinates(c(1,1,2,4))

Error in (function (classes, fdef, mtable)  : unable to find an inherited method for function ‘coordinates’ for signature ‘"numeric"’

Я все еще новичок в R и коде и т. д., поэтому, когда я запускаю traceback (), я действительно не понимаю, что он мне говорит:

3: stop(gettextf("unable to find an inherited method for function %s for signature %s", 
   sQuote(fdef@generic), sQuote(cnames)), domain = NA)
2: (function (classes, fdef, mtable) 
  {
   methods <- .findInheritedMethods(classes, fdef, mtable)
   if (length(methods) == 1L) 
       return(methods[[1L]])
   else if (length(methods) == 0L) {
       cnames <- paste0(""", sapply(classes, as.character), 
           """, collapse = ", ")
       stop(gettextf("unable to find an inherited method for function %s for signature %s", 
           sQuote(fdef@generic), sQuote(cnames)), domain = NA)
   }
   else stop("Internal error in finding inherited methods; didn't return a unique method", 
       domain = NA)
  })(list("numeric"), function (obj, ...) 
  standardGeneric("coordinates"), <environment>)
1: coordinates(c(1, 1, 2, 4))

В основном я не знаю, почему не работает функция coordinates() после обновления. Любое понимание этого, а также, возможно, перевод обратного следа будет огромной помощью. Спасибо!

1 5

1 ответ:

Я не могу ответить ни на вопрос, ни на проблему. Первоначально я не мог воспроизвести вашу ошибку:

library(diagram)
openplotmat()
(elpos1 <- diagram::coordinates(c(1,1,2,4)))
#       [,1]  [,2]
# [1,] 0.500 0.875
# [2,] 0.500 0.625
# ...

Нахождение Одноименных Функций

Однако поиск других экземпляров функции coordinates показал следующее:
help.search('coordinates', fields='name')
# Help files with name matching 'coordinates' using fuzzy matching:
# 
# diagram::coordinates                  coordinates of elements on a plot
# sp::coordinates-methods               retrieve (or set) spatial coordinates
# sp::coordinates                       sets spatial coordinates to create spatial data, or retrieves spatial
#                                       coordinates
# sp::coordnames                        retrieve or assign coordinate names for classes in sp

Этот вывод выполняет поиск всех установленных (не обязательно загруженных) пакетов. Из этого следует, что sp также имеет один. Использование его версии в вашем случае использования приводит к ошибке.

Порядок загрузки пакета (или, замаскированный Функции)

Порядок загрузки пакетов важен, так как функции из более поздних загруженных функций маскируют функции с тем же именем из ранее загруженных пакетов. В частности:

# ensure we have neither package loaded
detach(package:diagram, unload=TRUE) # ignore errors if not loaded
detach(package:sp, unload=TRUE)      # ignore errors if not loaded
library(diagram)
library(sp)
# Attaching package: 'sp'
# 
# The following object is masked from 'package:diagram':
# 
#     coordinates
Это сообщение говорит вам, что простой вызов coordinates() будет использовать версию из sp, а не из diagram. (Для каждого блока кода ниже я использую detach(), как и выше, чтобы убедиться, что ни пакет, ни его пространство имен по-прежнему не существует.)

Использование версии sp приводит к той же ошибке что вы получили, загрузив библиотеки в порядок: diagram, sp:

library(diagram)
library(sp)
# Attaching package: 'sp'
# 
# The following object is masked from 'package:diagram':
# 
#     coordinates
(elpos <- coordinates(c(1,1,2,4)))
# Error in (function (classes, fdef, mtable)  : 
# unable to find an inherited method for function 'coordinates' for signature '"numeric"'

traceback() идентичен тому, что вы предоставили.

Обратный порядок загрузки работает:

library(sp)
library(diagram)
# Attaching package: 'diagram'
# 
# The following object is masked from 'package:sp':
# 
#     coordinates
(elpos <- coordinates(c(1,1,2,4)))
#       [,1]  [,2]
# [1,] 0.500 0.875
# [2,] 0.500 0.625
# ...
Обратите внимание, что предупреждение теперь говорит вам, что sp::coordinates() теперь маскируется.

Когда Сомневаешься, Будь Недвусмысленным

Если есть какие-либо сомнения относительно того, какая версия вызывается, мы всегда можем форсировать, какую мы намерены использовать:

(elpos <- diagram::coordinates(c(1,1,2,4)))
#       [,1]  [,2]
# [1,] 0.500 0.875
# [2,] 0.500 0.625
# ...

Я чувствую себя немного не в своей тарелке, отправляя это как ответьте , поскольку я обращаюсь к вашей проблеме и не обязательно к заявленному вопросу. Пожалуйста, продолжайте запрашивать ответы, если вам все еще нужно выследить результаты traceback(). В этом усилии, однако, я не смог найти .findInheritedMethods(), но это имеет смысл, когда diagram::coordinates ожидает вектор, задающий число элементов в каждой строке, или 2-столбчатую матрицу с позицией элемента, или 'NULL', в то время как sp::coordinates ожидает объект, производный от класса "Spatial" (что, безусловно, не является простым вектором).