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

178

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

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

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

Error: could not find function "some.function"

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

Joris Meys
источник
5
Прежде чем голосовать, чтобы закрыть этот вопрос, сначала прочтите это обсуждение на meta: meta.stackexchange.com/questions/101892/…
Andrie
2
Если ничего не помогает, попробуйте очистить исходный код для базы R и ваших установленных пакетов
nullglob
3
@nullglob Это выглядит несколько экстремально :-)
Гэвин Симпсон
У меня есть соответствующий вопрос: stackoverflow.com/questions/23357551/… . В этом случае ЛЮБАЯ Rкоманда не выполняется, но q()! Совет будет с благодарностью!
Александр Блех
Может быть, глупо, но будьте осторожны, чтобы не называть выходные данные функции самой функцией. [Учено на опыте ...]
user3507584

Ответы:

126

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

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

Joris Meys
источник
Привет, Джорис, у меня быстрый вопрос. Я новичок в R, но я смог успешно установить его. Я хотел бы использовать функцию «cosvol» в «небесном» пакете из командной строки. В отличие от моего R, который устанавливается из репозитория Fedora в мою систему Linux, я загрузил свой «небесный» пакет в другой каталог в моем «home». Каждый раз, когда я запрашиваю функцию «cosvol ()», он говорит, «не может найти функцию« cosdistCoVol ».» Я не уверен, как сообщить R о моем директоре, в котором все функции загружаются в мой «небесный» пакет отдельно. Ваша помощь приветствуется.
Бенджамин
Если функция находится в одной из библиотек core / base R, вам может потребоваться ее обновить. В моем случае я пытался использовать hasNameфункцию в utils. Тем не менее, я использовал 3.3.1 и hasNameне был представлен до 3.4.0. Поскольку вы не можете обновить utilsкак отдельную библиотеку, R / R Studio сказала, что у меня нет библиотек для обновления.
mpag
@mpag Это потому, что пакет utils является неотъемлемой частью выпуска R. Если вы будете использовать RSiteSearch ("hasName") буквально, первая запись является ссылкой на пакет backports, который сделает эту функцию доступной в R 3.3.1. Смотрите также github.com/r-lib/backports для получения дополнительной информации. Я добавил информацию для этого случая, спасибо за уведомление
Joris Meys
@JorisMeys, это очень полезно. Я также хотел бы заявить, что это должно быть стандартной практикой документирования, когда функция была добавлена ​​в R на странице справки этой функции (например,? HasName). Например, ни сказать, https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNameни https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.html«введено в R 3.4.0», я решил выяснить это, просматривая репозитории github и просматривая blameдля utils / R / hasName.R и base / R / match.R
mpag
@mpag или вы могли открыть буквально первый хит RSiteSearch("hasName")и получить ту же информацию. Вот почему я добавил это несколько лет назад к этому ответу. Это полезный трюк, чтобы знать ;-)
Joris Meys
29

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

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

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

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

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

Гэвин Симпсон
источник
1
спасибо - это спасло меня после обновления до R 3 для could not find function "anova.lm"... исправлено с вызовом stats:::anova.lm()вместо
ErichBSchulz
Хотя это не так важно, использование :::было упомянуто как ошибка проектирования, и это ::является предпочтительным. Не могу легко найти ссылку.
NelsonGon
1
@NelsonGon При всем уважении, ::и :::являются различными и ваша правка не работает ! plot.prcomp()Функция не экспортируется из пространства имен статистики , так что вы должны использовать :::.
Гэвин Симпсон
@GavinSimpson Верно! Я взял слово уважаемого R dev для ошибки дизайна и никогда не проверял это. Возможно, это было их личное мнение.
NelsonGon
11

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

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

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

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

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

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

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

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

.myHiddenFunction <- function(x) cat("my hidden function")
Jacob
источник
Это терпит неудачу для меня в RStudio - Ошибка: '\.' нераспознанный выход в символьной строке, начинающейся с "" ^ [^ \. "
Эндрю
1
Любые предложения о том, что я мог бы сделать, если я получу ошибку при использовании пакета, который я не написал? Похоже, что сам пакет хочет использовать внутренний метод, который не определен, потому что, по-видимому, автор не сделал выше.
Андре Луус
4

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

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

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

exportPattern ( "")

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

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

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

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

математический
источник
2

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

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

Maj
источник
1

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

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

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
катастрофический провал
источник
0

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

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

в

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

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

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

Акшай Виджай Джайн
источник
1
Не могли бы вы пояснить, какова была ошибка. Это может помочь, но только в очень конкретных случаях.
Йорис Мейс