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

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

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

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

Error: could not find function "some.function"

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

11 ответов

Решение

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

  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") или поиск с помощью rseek - это альтернативные способы поиска функции.

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

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

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

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

Во-первых, вы не должны вызывать методы S3 напрямую, но давайте предположим, 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. Но, как я уже сказал, если функция, которую вы хотите вызвать, существует (например, это может быть скрытая служебная функция), но находится в пространстве имен, R сообщит, что не может найти функцию, если вы не скажете ей, какое пространство имен искать в.

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

  1. Фортран установлен? (Ищите "gfortran".) Это влияет на несколько основных пакетов в R.
  2. Java установлена? Верны ли пути классов Java?
  3. Убедитесь, что пакет был установлен администратором и доступен для использования соответствующим пользователем. Иногда пользователи устанавливают пакеты в неправильных местах или запускают без соответствующего доступа к нужным библиотекам. .libPaths() это хорошая проверка.
  4. Проверьте ldd результаты для R, чтобы быть уверенным в общих библиотеках
  5. Хорошо периодически запускать скрипт, который просто загружает каждый необходимый пакет и проводит небольшой тест. Это ловит проблему пакета как можно раньше в рабочем процессе. Это похоже на тестирование сборки или модульное тестирование, за исключением того, что это больше похоже на тест на дым, чтобы убедиться, что самые базовые вещи работают.
  6. Если пакеты могут храниться в доступном для сети месте, не так ли? Если они не могут, есть ли способ обеспечить согласованные версии на всех машинах? (Это может показаться OT, но правильная установка пакета включает наличие правильной версии.)
  7. Доступен ли пакет для данной ОС? К сожалению, не все пакеты доступны на разных платформах. Это возвращается к шагу 5. Если возможно, попробуйте найти способ обработки другой ОС, переключившись на соответствующий вариант пакета или отключив зависимость в определенных случаях.

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

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

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

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

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

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

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

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

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

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

случается, когда я делаю проверку CMD пакета, который я делал с RStudio. Я нашел добавление

exportPattern("")

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

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

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

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

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

Функция, которую невозможно найти, может не быть названной функцией. Я столкнулся с этой ошибкой при использовании функции в модуле R/cR, которая была определена в модуле R/aR, который ранее успешно использовался в R/bR с файлами, полученными в порядке a,b,c. Один из параметров, которые я передавал, был глобальным. Это, в свою очередь, было установлено функцией. У функции была зависимость, которая, в свою очередь, привела к ошибке. Разрешение ошибки в зависимости, которая также была определена в R/aR, устранило ошибку. Это один из тех многих случаев, когда ленивые вычисления приводят к трудно поддающимся отладке ситуациям. Итак, если ошибка кажется бессмысленной, внимательно посмотрите на параметры и на то, как они устанавливаются.

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

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

в

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

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

Это простое решение, просто обновите вашу R Studio

Другие вопросы по тегам