Помилка: не вдалося знайти функцію… в R


177

Це має бути питанням поширених запитань, тому будьте якомога повнішими. Відповідь - це відповідь громади, тому сміливо редагуйте, якщо ви думаєте, що щось не вистачає.

Це питання було обговорено та затверджено на мета.

Я використовую R і спробував, some.functionале отримав таке повідомлення про помилку:

Error: could not find function "some.function"

Це питання виникає дуже регулярно. Коли ви отримуєте цей тип помилки в R, як ви можете їх вирішити?


5
Перш ніж проголосувати за закриття цього питання, спочатку прочитайте це обговорення на мета: meta.stackexchange.com/questions/101892/…
Андрі

2
Якщо все інше не вдається, спробуйте зібрати вихідний код для базової R та встановлених пакетів
nullglob

3
@nullglob Це здається дещо екстремальним :-)
Гевін Сімпсон

У мене є відповідне питання: stackoverflow.com/questions/23357551/… . У цьому випадку будь-яка Rкоманда не вдається, але q()! Поради будуть дуже вдячні!
Олександр Блех

Можливо, нерозумно, але будьте обережні, щоб не називати вихідну функцію самою функцією. [Навчений досвідом ...]
користувач3507584

Відповіді:


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 repo backports . Майте на увазі, що версії R, старші за R3.0.0, несумісні з пакетами, розробленими для R3.0.0 та пізніших версій.


Привіт Йоріс, у мене швидке запитання. Я новачок в R, але мені вдалося його успішно встановити. Я б хотів використовувати функцію "cosvol" у пакеті "небесний" з командного рядка. На відміну від мого R, який встановлений із сховища Fedora в мою систему Linux, я завантажив свій «небесний» пакет в інший каталог у своєму «будинку». Щоразу, коли я запитую функцію "cosvol ()", вона каже, "не вдалося знайти функцію" cosdistCoVol "." Я не впевнений, як дозволити R знати про мого директора, в якому всі функції завантажуються в мій "небесний" пакет окремо. Ваша допомога вдячна.
Бенджамін

Якщо функція знаходиться в одній з основних / базових бібліотек 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 для отримання додаткової інформації. Я додав інформацію про цей випадок, thx для сповіщення
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утиліти / 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

Хоча це не так актуально, використання :::згадується як помилка дизайну, і це ::є кращим. Неможливо знайти посилання.
НельсонГон

1
@NelsonGon При всій повазі, ::і :::є різними і ваша правка НЕ працює ! plot.prcomp()Функція НЕ експортується з простору імен статистики , так що ви повинні використовувати :::.
Гевін Сімпсон

@GavinSimpson Право! Я взяв шановане слово R dev за помилку в дизайні і ніколи не перевіряв його. Можливо, це була їхня особиста думка.
НельсонГон

11

Зазвичай я можу вирішити цю проблему, коли комп'ютер знаходиться під моїм контролем, але це більше неприємності при роботі з сіткою. Якщо сітка не є однорідною, не всі бібліотеки можуть бути встановлені, і мій досвід часто був у тому, що пакет не був встановлений, оскільки залежність не була встановлена. Щоб вирішити це, я перевіряю наступне:

  1. Чи встановлений Fortran? (Шукайте "gfortran".) Це впливає на кілька основних пакетів у Р.
  2. Установлена ​​Java? Чи правильні шляхи до класу Java?
  3. Переконайтеся, що пакет був встановлений адміністратором та чи доступний він для використання відповідним користувачем. Іноді користувачі встановлюватимуть пакунки в неправильних місцях або працюватимуть без відповідного доступу до потрібних бібліотек. .libPaths()це хороша перевірка.
  4. Перевірте lddрезультати для R, щоб бути впевненим у спільних бібліотеках
  5. Добре періодично запускати сценарій, який просто завантажує кожен необхідний пакет і робить невеликий тест. Це вирішує проблему з пакетом якомога раніше в робочому процесі. Це схоже на побудову тестування або тестування одиниць, за винятком того, що це як тест на дим, щоб переконатися, що саме основні речі працюють.
  6. Якщо пакети можна зберігати у доступному для мережі місці, чи не так? Якщо вони не можуть, чи є спосіб забезпечити послідовну версію на всіх машинах? (Це може здатися вільним, але правильна установка пакета включає наявність правильної версії.)
  7. Чи доступний пакет для даної ОС? На жаль, не всі пакети доступні на різних платформах. Це повертається до кроку 5. Якщо можливо, спробуйте знайти спосіб поводження з іншою ОС, переключившись на відповідний аромат упаковки або відключіть залежність у певних випадках.

Зустрівши це досить небагато, деякі з цих кроків стають досить рутинними. Хоча номер 7 може здатися непоганою відправною точкою, вони перераховані приблизно в тому порядку, за яким частотою я їх використовую.


2
Корисні міркування, щоб бути впевненим, але більше відповіді на тему "Чому я отримую помилку під час встановлення пакета".
IRTFM

@DWin: Можливо, але не дуже. Можливо, я був незрозумілий. Ці проблеми виникають, коли робота зупиняється на сітці, оскільки пакет не був встановлений. Підтримання послідовності програмного забезпечення в сітці не є складним, але вимагає хорошого процесу встановлення, обслуговування та налагодження. Це лише деякі пункти, що надходять з кожної фази, принаймні, оскільки вони стосуються звуку, що лущиться, коли виникає, коли функція недоступна. :)
Ітератор

6

Якщо це відбувається під час перевірки вашого пакету (перевірка CMD), подивіться на свій НАЗАД.

Ви можете вирішити це, додавши в NAMESPACE наступне твердження:

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

Це експортує все, що не починається з крапки ("."). Це дозволяє мати приховані функції, починаючи з крапки:

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

Це не вдалося мені в RStudio - Помилка: '\.' - це нерозпізнана втеча в рядку символів, починаючи з "" ^ [^ \. "
Андрій

1
Будь-які пропозиції щодо того, що я можу зробити, якщо я отримав помилку під час використання пакету, який я не написав? Сам пакунок, схоже, хоче використовувати внутрішній метод, який не визначений, оскільки, імовірно, автор цього не зробив.
Андре Луус

4

У мене була помилка

Помилка: не вдалося знайти функцію some.function

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

exportPattern (".")

щоб файл NAMESPACE зробив свою справу. Як сторонне позначення, я спочатку налаштував RStudio використовувати ROxygen для виготовлення документації - і вибрав конфігурацію, де ROxygen запише мій файл NAMESPACE для мене, який постійно стирав мої зміни. Отже, в моєму випадку я зняв NAMESPACE з конфігурації Roxygen і додав exportPattern (".") До NAMESPACE, щоб вирішити цю помилку.


1
Вам краще використовувати roxygen2, щоб він розпізнавав зміни, які ви вносите до файлів простору імен, і зберігає їх недоторканими. Я також настійно не рекомендую використовувати файл ExportPattern (".") У файлі простору імен. Замість цього використовуйте тег @export в окремих файлах, щоб ви експортували лише ті функції, які потребують експорту. Roxygen2 автоматично оновить простір імен для експорту всіх функцій, які потребують експорту.
Joris Meys

1
Джоріс - я дуже вдячний, що ви витратили час для коментарів; Я згодний на 100% з тим, що ви написали. Зараз я використовую devtools / roxygen2 і вкладаю наступне у всі функції, які мені потрібно експортувати: # '@export
swihart

4

Ця помилка може виникнути, навіть якщо ім'я функції є дійсним, якщо деякі обов'язкові аргументи відсутні (тобто ви не надали достатньо аргументів).
Я отримав це в контексті Rcpp, де я написав функцію C ++ з опціональними аргументами, і не надавав цих аргументів у Р. Виявилося, що опціональні аргументи з C ++ були визнані R. обов'язковими. В результаті R не міг знайти функція узгодження правильної назви, але неправильна кількість аргументів.

Функція Rcpp: SEXP RcppFunction(arg1, arg2=0) {}
R Дзвінки:
RcppFunction(0)збільшує помилку
RcppFunction(0, 0)не


2

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

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


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

Добре місце @Joris Meys
Tony Cronin

-1

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

Настільки просте рішення, просто оновіть свою R Studio


1
Чи можете ви, будь ласка, детальніше розповісти, в чому полягає помилка. Це може допомогти, але лише у дуже конкретних випадках.
Йоріс Мейс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.