Ошибка: не удалось найти функцию... в R
Это вопрос FAQ, поэтому, пожалуйста, будьте как можно полнее. Ответ - это ответ сообщества, поэтому не стесняйтесь редактировать, если вы считаете, что чего-то не хватает.
Этот вопрос обсуждался и утверждался по мета.
Я использую R и пробовал some.function
но я получил следующее сообщение об ошибке:
Error: could not find function "some.function"
Этот вопрос возникает очень регулярно. Когда вы получите этот тип ошибки в R, как вы можете его решить?
Ответы
Ответ 1
Есть несколько вещей, которые вы должны проверить:
- Вы правильно написали название своей функции? Имена чувствительны к регистру.
- Вы установили пакет, содержащий функцию?
install.packages("thePackage")
(это нужно сделать только один раз) - Вы прикрепили этот пакет к рабочей области?
require(thePackage)
или library(thePackage)
(это следует делать каждый раз, когда вы начинаете новый сеанс R) - Вы используете более старую версию R, где эта функция еще не существовала?
Если вы не уверены, в каком пакете находится эта функция, вы можете сделать несколько вещей.
- Если вы уверены, что установили и подключили/загрузили нужный пакет, введите
help.search("some.function")
или ??some.function
чтобы получить информационное окно, в котором можно указать, в каком пакете он содержится. -
find
и getAnywhere
также могут быть использованы для поиска функций. - Если вы не имеете ни малейшего представления о пакете, вы можете использовать
findFn
в sos
пакете, как описано в этом ответе. -
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