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

146

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

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

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

Error: could not find function "some.function"

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

  • 3
    Прежде чем голосовать, чтобы закрыть этот вопрос, сначала прочтите это обсуждение на meta: meta.stackexchange.com/questions/101892/…
  • 2
    Если ничего не помогает, попробуйте очистить исходный код для базы R и установленных пакетов
Показать ещё 3 комментария
Теги:
function
error-handling
r-faq

10 ответов

98
Лучший ответ

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

  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 и более поздних версий.

  • 0
    Привет, Джорис, у меня быстрый вопрос. Я новичок в R, но я смог успешно установить его. Я хотел бы использовать функцию «cosvol» в «небесном» пакете из командной строки. В отличие от моего R, который устанавливается из репозитория Fedora в мою систему Linux, я загрузил свой «небесный» пакет в другой каталог в моем «home». Каждый раз, когда я запрашиваю функцию "cosvol ()", он говорит, что "не может найти функцию" cosdistCoVol "." Я не уверен, как сообщить R о моем директоре, в котором все функции загружаются в мой «небесный» пакет отдельно. Ваша помощь ценится.
  • 0
    Если функция находится в одной из базовых / базовых библиотек R, вам может потребоваться ее обновить. В моем случае, я пытался использовать hasName функцию в utils . Тем не менее, я использовал 3.3.1 и hasName не был представлен до 3.4.0. Поскольку вы не можете обновить utils как автономную библиотеку, R / R Studio сказала, что у меня нет библиотек для обновления.
Показать ещё 3 комментария
24

Другая проблема, при наличии 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 сообщит, что она не может найти функцию, если вы не укажете, какое пространство имен должно выглядеть в.

  • 0
    спасибо - это спасло меня после обновления до R 3, так как could not find function "anova.lm" ... исправлено с помощью вызова stats:::anova.lm()
10

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

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

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

  • 2
    Полезные соображения, чтобы быть уверенным, но больше ответ на вопрос «Почему я получаю ошибку при установке пакета».
  • 0
    @DWin: Может быть, но не совсем. Возможно, я был неясен. Эти проблемы возникают, когда работа останавливается в сетке из-за того, что пакет не был установлен. Поддержание согласованности программного обеспечения в сетке не сложно, но требует хорошего процесса установки, обслуживания и отладки. Это лишь некоторые из элементов, которые появляются на каждой фазе, по крайней мере, так как они связаны с пронзительным звуком, который появляется, когда функция недоступна. :)
5

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

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

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

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

.myHiddenFunction <- function(x) cat("my hidden function")
  • 0
    Это терпит неудачу для меня в RStudio - Ошибка: '\.' является нераспознанным экранированием в символьной строке, начинающейся с "" ^ [^ \. "
  • 3
    exportPattern ("^ [^ \\.]") работает
Показать ещё 1 комментарий
4

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

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

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

exportPattern ( "")

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

  • 1
    Лучше использовать roxygen2, который распознает изменения, внесенные вами в файлы пространства имен, и сохраняет их нетронутыми. Я также настоятельно рекомендую не использовать exportPattern (".") В файле пространства имен. Вместо этого используйте тег @export в отдельных файлах, чтобы экспортировать только те функции, которые необходимо экспортировать. Roxygen2 автоматически обновит пространство имен для экспорта всех функций, которые необходимо экспортировать.
  • 1
    Йорис - Я действительно ценю, что вы нашли время, чтобы прокомментировать; Я согласен на 100% с тем, что вы написали. Сейчас я использую devtools / roxygen2 и добавляю во все функции, которые мне нужно экспортировать, следующее: # '@export
3

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

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

2

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

Изображение 4360

1

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

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

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

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

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

в

wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)
  • 1
    Ошибка говорит «сравнение» вместо «сравнение». Я считаю, что пространство имен не было проблемой :-)
  • 0
    Хорошее место @Joris Meys
-1

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

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

  • 1
    Не могли бы вы пояснить, какова была ошибка. Это может помочь, но только в очень конкретных случаях.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню