Блок-схема с использованием {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 ответ:
Я не могу ответить ни на вопрос, ни на проблему. Первоначально я не мог воспроизвести вашу ошибку:
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" (что, безусловно, не является простым вектором).