Ошибка: не удалось найти функцию ... в R - PullRequest
162 голосов
/ 11 августа 2011

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

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

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

Error: could not find function "some.function"

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

Ответы [ 10 ]

114 голосов
/ 11 августа 2011

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

  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 и хотите использовать более новую функцию, вы можете использовать пакет backports , чтобы сделать такие функции доступными. Вы также найдете список функций, которые необходимо перенести в репозиторий git reports . Имейте в виду, что версии R старше R3.0.0 несовместимы с пакетами, созданными для R3.0.0 и более поздних версий.

28 голосов
/ 11 августа 2011

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

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

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

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

> 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 возвращает значение имени внутренней переменной.

11 голосов
/ 11 августа 2011

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

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

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

5 голосов
/ 08 мая 2012

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

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

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

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

.myHiddenFunction <- function(x) cat("my hidden function")
4 голосов
/ 11 июля 2014

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

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

4 голосов
/ 29 августа 2013

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

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

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

exportPattern (".")

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

2 голосов
/ 04 сентября 2015

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

enter image description here

1 голос
/ 02 июля 2016

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

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

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
0 голосов
/ 26 марта 2018

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

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

до

wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)
0 голосов
/ 14 ноября 2016

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

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

...