2011-08-11 2 views
135

This is meant to be a FAQ question, so please be as complete as possible. The answer is a community answer, so feel free to edit if you think something is missing.Ошибка: не удалось найти функцию ... в R

This question was discussed and approved on meta.

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

Error: could not find function `some.function` 

Этот вопрос возникает очень регулярно. Когда вы получите error: could not find function в R, как вы можете его решить?

+3

Перед тем, как голосовать, чтобы закрыть этот вопрос, сначала прочтите эту disussion на мета: http://meta.stackexchange.com/questions/101892/community-wiki-with- common-error-messages-allowed/101901 # 101901 – Andrie

+2

Если все остальное не удается, попробуйте grepping исходный код для базы R и установленных пакетов – nullglob

+3

@nullgl ob Это кажется несколько экстремальным :-) –

ответ

92

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

  1. Вы написали имя вашей функции правильно? Имена чувствительны к регистру.
  2. Вы установили пакет, содержащий функцию? install.packages("thePackage") (это только нужно сделать один раз)
  3. Вы прикрепляли этот пакет к рабочему пространству? require(thePackage) или library(thePackage) (это должно быть сделано каждый раз, когда вы начинаете новую R сессии)

Если вы не уверены в каком пакете эта функция находится, вы можете сделать несколько вещей.

  1. Если вы уверены, что вас установлены и присоединены/загружен правильный пакет, типа help.search("some.function") или ??some.function получить информационный блок, который может сказать вам, в каком пакете он содержится.
  2. find и getAnywhere также могут использоваться для определения функций.
  3. Если у вас нет информации о пакете, вы можете использовать findFn в пакете sos, как описано в this answer.
  4. RSiteSearch("some.function") или поиск с помощью rseek - это альтернативные способы поиска функции.
+0

Привет, Джорис, у меня есть быстрый вопрос. Я новичок в R, но я смог его успешно установить. Я хотел бы использовать функцию «cosvol» в «небесном» пакете из командной строки. В отличие от моего R, который установлен из репозитория Fedora в мою систему Linux, я загрузил свой «небесный» пакет в другой каталог в моем «доме». Каждый раз, когда я запрашиваю функцию «cosvol()», она говорит: «Не удалось найти функцию« cosdistCoVol »». Я не уверен, как сообщить R о моем директоре, в котором все функции загружаются в моем «небесном» пакете отдельно. Ваша помощь приветствуется. – Benjamin

10

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

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

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

+1

Полезные советы, но больше ответ на вопрос «Почему я получаю сообщение об ошибке при установке пакета». –

+0

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

24

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

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

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

Во-первых, вы не должны называть методы S3 непосредственно, но позволяет предположить plot.prcomp было на самом деле некоторые полезные функции внутреннего в пакет обув. Чтобы вызвать такую ​​функцию, если вы знаете, что вы делаете, необходимо использовать :::. Вам также необходимо знать пространство имен, в котором функция найдена. Использование 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 сообщит, что она не может найти функцию, если вы не укажете, какое пространство имен должно выглядеть in

+0

спасибо - это спасло меня после обновления до R 3 для 'не удалось найти функцию« anova.lm »' ... исправлено с вызовом 'stats ::: anova.lm() 'вместо – ErichBSchulz

5

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

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

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

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

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

Это не удается для меня в RStudio - Ошибка: '\.' является непризнанным побегом в символьной строке, начинающейся с «^^^.» – Andrew

+2

exportPattern ("^ [^ \\.]") работает – Andrew

+1

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

4

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

Error: could not find function some.function

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

exportPattern ("")

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

+1

Вам лучше использовать roxygen2, который распознает внесенные вами изменения в файлы пространства имен и сохраняет их неповрежденными Я также настоятельно рекомендую использовать exportPattern (".") В файле пространства имен. Используйте тег @export вместо этого в ваших отдельных файлах, поэтому вы экспортируете только те функции, которые требуют экспорта. Roxygen2 автоматически обновит пространство имен, чтобы экспортировать все функции, которые требуют экспорта. –

+1

Joris - Я очень ценю, что вы тратите время на комментарии, я согласен на 100% с тем, что вы написали. Теперь я использую devtools/roxygen2, и я делаю следующее во всех функциях, которые мне нравятся d экспортируется: # '@export – swihart

3

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

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

2

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

enter image description here

0

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

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

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

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

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

+0

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