Ошибка: не удалось найти функцию... в R

Это вопрос FAQ, поэтому, пожалуйста, будьте как можно полнее. Ответ - это ответ сообщества, поэтому не стесняйтесь редактировать, если вы считаете, что чего-то не хватает.

Этот вопрос обсуждался и утверждался по мета.

Я использую R и пробовал some.function но я получил следующее сообщение об ошибке:

Error: could not find function "some.function"

Этот вопрос возникает очень регулярно. Когда вы получите этот тип ошибки в R, как вы можете его решить?

Ответ 1

Есть несколько вещей, которые вы должны проверить:

  1. Вы правильно написали название своей функции? Имена чувствительны к регистру.
  2. Вы установили пакет, содержащий функцию? install.packages("thePackage") (это нужно сделать только один раз)
  3. Вы прикрепили этот пакет к рабочей области? require(thePackage) или library(thePackage) (это следует делать каждый раз, когда вы начинаете новый сеанс R)
  4. Вы используете более старую версию R, где эта функция еще не существовала?

Если вы не уверены, в каком пакете находится эта функция, вы можете сделать несколько вещей.

  1. Если вы уверены, что установили и подключили/загрузили нужный пакет, введите help.search("some.function") или ??some.function чтобы получить информационное окно, в котором можно указать, в каком пакете он содержится.
  2. find и getAnywhere также могут быть использованы для поиска функций.
  3. Если вы не имеете ни малейшего представления о пакете, вы можете использовать findFn в sos пакете, как описано в этом ответе.
  4. RSiteSearch("some.function") или поиск с помощью rdocumentation или rseek являются альтернативными способами поиска функции.

Иногда вам нужно использовать более старую версию R, но запускать код, созданный для более новой версии. Недавно добавленные функции (например, hasName в R 3.4.0) не будут найдены. Если вы используете более старую версию R и хотите использовать более новую функцию, вы можете использовать обратные порты пакета, чтобы сделать такие функции доступными. Вы также найдете список функций, которые необходимо перенести в репозиторий git. Имейте в виду, что версии R старше R3.0.0 несовместимы с пакетами, созданными для R3.0.0 и более поздних версий.

Ответ 2

Другая проблема в присутствии NAMESPACE заключается в том, что вы пытаетесь запустить неэкспортированную функцию из пакета foo.

Например (надуманный, я знаю, но):

> mod <- prcomp(USArrests, scale = TRUE)
> plot.prcomp(mod)
Error: could not find function "plot.prcomp"

Во-первых, вам не следует напрямую вызывать методы S3, но давайте предположим, plot.prcomp фактически plot.prcomp была некоторой полезной внутренней функцией в пакете foo. Для вызова такой функции, если вы знаете, что делаете, требуется использование :. Вам также необходимо знать пространство имен, в котором находится функция. Используя getAnywhere() мы находим, что функция находится в статистике пакета:

> getAnywhere(plot.prcomp)
A single object matching ‘plot.prcomp was found
It was found in the following places
  registered S3 method for plot from namespace stats
  namespace:stats
with value

function (x, main = deparse(substitute(x)), ...) 
screeplot.default(x, main = main, ...)
<environment: namespace:stats>

Теперь мы можем вызвать его напрямую, используя:

> stats:::plot.prcomp(mod)

Я использовал plot.prcomp в качестве примера для иллюстрации цели. При обычном использовании вы не должны вызывать такие методы S3. Но, как я уже сказал, если функция, которую вы хотите вызвать, существует (например, это может быть скрытая служебная функция), но находится в namespace, R сообщит, что не может найти функцию, если вы не скажете ей, какое пространство имен искать в.

Сравните это со следующим: stats::plot.prcomp Вышеприведенное не работает, потому что, хотя stats использует plot.prcomp, он не экспортируется из stats как правильно говорит нам ошибка:

Ошибка: "plot.prcomp" не является экспортированным объектом из "пространства имен: статистика"

Это задокументировано следующим образом:

pkg :: name возвращает значение экспортированного имени переменной в пространстве имен pkg, тогда как pkg: name возвращает значение имени внутренней переменной.

Ответ 3

Обычно я могу решить эту проблему, когда компьютер находится под моим контролем, но это больше неприятно при работе с сеткой. Когда сетка не является однородной, не все библиотеки могут быть установлены, и мой опыт часто заключался в том, что пакет не был установлен, потому что зависимость не была установлена. Чтобы решить эту проблему, я проверю следующее:

  • Установлен ли Fortran? (Ищите "gfortran".) Это затрагивает несколько крупных пакетов в R.
  • Установлена ​​ли Java? Правильны ли пути класса Java?
  • Убедитесь, что пакет был установлен администратором и доступен для использования соответствующим пользователем. Иногда пользователи устанавливают пакеты в неправильном месте или запускают без соответствующего доступа к соответствующим библиотекам. .libPaths() - хорошая проверка.
  • Проверьте ldd результаты для R, чтобы убедиться в общих библиотеках
  • Хорошо периодически запускать script, который просто загружает каждый необходимый пакет и делает небольшой тест. Это улавливает проблему пакета как можно раньше в рабочем процессе. Это похоже на сборку тестирования или модульного тестирования, за исключением того, что он больше похож на smoke test, чтобы убедиться, что работает самый базовый материал.
  • Если пакеты можно хранить в доступном для сети месте, не так ли? Если они не могут, существует ли способ обеспечить согласованные версии машин? (Это может показаться OT, но правильная установка пакета включает наличие правильной версии.)
  • Доступен ли пакет для данной ОС? К сожалению, не все пакеты доступны на разных платформах. Это вернется к шагу 5. Если возможно, попробуйте найти способ обработки другой ОС, переключившись на соответствующий вкус пакета или отключите зависимость в определенных случаях.

Поняв это довольно много, некоторые из этих шагов становятся довольно рутинными. Хотя # 7 может показаться хорошей отправной точкой, они перечислены в приблизительном порядке частоты, которую я им использую.

Ответ 4

Если это происходит, когда вы проверяете свой пакет (проверка R CMD), взгляните на свой NAMESPACE.

Вы можете решить эту проблему, добавив следующую инструкцию в NAMESPACE:

exportPattern("^[^\\\\.]")

Это экспортирует все, что не начинается с точки ( "." ). Это позволяет вам иметь скрытые функции, начиная с точки:

.myHiddenFunction <- function(x) cat("my hidden function")

Ответ 5

У меня была ошибка

Ошибка: не удалось найти функцию some.function

происходит при выполнении проверки R CMD пакета, который я делал с RStudio. Я нашел добавление

exportPattern ( "")

в файл NAMESPACE сделал трюк. В качестве оповещения я первоначально настроил RStudio на использование ROxygen для создания документации - и выбрал конфигурацию, в которой ROxygen записывал бы мой файл NAMESPACE для меня, который продолжал стирать мои изменения. Итак, в моем экземпляре я снял флажок NAMESPACE из конфигурации Roxygen и добавил exportPattern ( "." ) В NAMESPACE, чтобы решить эту ошибку.

Ответ 6

Эта ошибка может возникнуть, даже если имя функции допустимо, если отсутствуют некоторые обязательные аргументы (т.е. вы не указали достаточно аргументов).
Я получил это в контексте Rcpp, где я написал С++-функцию с опциональными аргументами и не предоставил эти аргументы в R. Похоже, что опциональные аргументы из С++ были замечены как обязательные R. В результате R не смог найти соответствующая функция для правильного имени, но неправильное количество аргументов.

Функция Rcpp: SEXP RcppFunction(arg1, arg2=0) {}
R звонки:
RcppFunction(0) вызывает ошибку
RcppFunction(0, 0) не

Ответ 7

Rdocumentation.org имеет очень удобную функцию поиска, которая, среди прочего, позволяет находить функции - из всех пакетов на CRAN, а также из пакетов Bioconductor и GitHub.

введите описание изображения здесь

Ответ 8

Если вы используете parallelMap, вам нужно экспортировать пользовательские функции в подчиненные задания, иначе вы получите сообщение об ошибке "не удалось найти функцию".

Если вы установили не пропущенный уровень на parallelStart, тот же аргумент должен быть передан в parallelExport, иначе вы получите ту же ошибку. Поэтому это должно строго соблюдаться:

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")

Ответ 9

Вы можете исправить эту ошибку по имени spacing :: вызов функции

comparison.cloud(colors = c("red", "green"), max.words = 100)

в

wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)

Ответ 10

Я получил то же самое, ошибка, я запускал версию .99xxx, я проверял обновления из меню справки и обновил My RStudio до 1.0x, затем ошибка не появилась

Так простое решение, просто обновите свою R Studio