Ошибка не могу найти функцию

Another problem, in the presence of a NAMESPACE, is that you are trying to run an unexported function from package foo.

For example (contrived, I know, but):

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

Firstly, you shouldn’t be calling S3 methods directly, but lets assume plot.prcomp was actually some useful internal function in package foo. To call such function if you know what you are doing requires the use of :::. You also need to know the namespace in which the function is found. Using getAnywhere() we find that the function is in package 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>

So we can now call it directly using:

> stats:::plot.prcomp(mod)

I’ve used plot.prcomp just as an example to illustrate the purpose. In normal use you shouldn’t be calling S3 methods like this. But as I said, if the function you want to call exists (it might be a hidden utility function for example), but is in a namespace, R will report that it can’t find the function unless you tell it which namespace to look in.

Compare this to the following:
stats::plot.prcomp
The above fails because while stats uses plot.prcomp, it is not exported from stats as the error rightly tells us:

Error: ‘plot.prcomp’ is not an exported object from ‘namespace:stats’

This is documented as follows:

pkg::name returns the value of the exported variable name in namespace pkg, whereas pkg:::name returns the value of the internal variable name.

  • Редакция Кодкампа

17 авг. 2022 г.
читать 1 мин


Одна ошибка, с которой вы можете столкнуться в R:

Error: could not find function "%>%"

Эта ошибка часто возникает, когда вы пытаетесь использовать функцию « %>% » в R без предварительной загрузки пакета dplyr .

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

library(dplyr)

В следующем примере показано, как исправить эту ошибку на практике.

Как воспроизвести ошибку

Предположим, у нас есть следующий фрейм данных в R, который отображает очки, набранные разными баскетболистами в разных командах:

#create data frame
df <- data.frame(team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'),
 points=c(6, 14, 15, 19, 22, 25, 39, 34))

#view data frame
df

 team points
1 A 6
2 A 14
3 A 15
4 A 19
5 B 22
6 B 25
7 B 39
8 B 34

Теперь предположим, что мы пытаемся использовать функцию « %>% », чтобы найти среднее количество очков, набранных игроками в каждой команде:

#find average points scored by players on each team
df %>%
 group_by(team) %>%
 summarize(avg_points = mean(points))

Мы получаем сообщение об ошибке, потому что мы никогда не загружали пакет dplyr.

Как исправить ошибку

Чтобы исправить эту ошибку, просто загрузите пакет dplyr перед использованием функции « %>% »:

library(dplyr)

#find average points scored by players on each team
df %>%
 group_by(team) %>%
 summarize(avg_points = mean(points))

# A tibble: 2 x 2
 team avg_points

1 A 13.5
2 B 30

Вывод отображает среднее количество очков, набранных игроками в каждой команде, и мы не получаем никаких ошибок, потому что мы загрузили пакет dplyr перед использованием функции « %>% ».

Дополнительные ресурсы

В следующих руководствах объясняется, как исправить другие распространенные ошибки в R:

Как исправить в R: не удалось найти функцию «ggplot»
Как исправить в R: ошибка выбора неиспользуемых аргументов
Как исправить в R: имена не совпадают с предыдущими именами

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

Вопрос:

Я запускаю пример на R, прохожу шаги и все работает до сих пор, за исключением этого кода выдает ошибку:

 words <- dtm %>%
as.matrix %>%
colnames %>%
(function(x) x[nchar(x) < 20])

Ошибка: не удалось найти функцию “%>%”

Я не понимаю, в чем преимущество использования этого специального оператора %>%, и любая обратная связь была бы полезной.

Лучший ответ:

Вам необходимо загрузить пакет (например, magrittr или dplyr), который сначала определяет функцию, затем она должна работать.

install.packages("magrittr") # package installations are only needed the first time you use it
install.packages("dplyr")    # alternative installation of the %>%
library(magrittr) # needs to be run every time you start R and want to use %>%
library(dplyr)    # alternatively, this also loads %>%

Трубный оператор %>% был введен для “сокращения времени разработки и улучшения читабельности и удобства сопровождения кода”.

Но каждый должен решить для себя, действительно ли это соответствует его рабочему процессу и делает вещи проще.
Для получения дополнительной информации о magrittr нажмите здесь.

Если не использовать канал %>%, этот код будет возвращать то же, что и ваш код:

words <- colnames(as.matrix(dtm))
words <- words[nchar(words) < 20]
words

EDIT:
(Я расширяю свой ответ из-за очень полезного комментария, сделанного @Molx)

Несмотря на то, что он из magrittr, оператор pipeопровода используется чаще с пакетом dplyr (который требует и загружает magrittr), так всякий раз, когда вы видите кого-то, использующего %>%, убедитесь, что вы не должны загружать dplyr вместо.

Ответ №1

В Windows: если вы используете% > % внутри цикла% dopar%, вам нужно добавить ссылку на загрузочный пакет dplyr (или magrittr, который загружается dplyr).

Пример:

plots <- foreach(myInput=iterators::iter(plotCount), .packages=c("RODBC", "dplyr")) %dopar%
{
return(getPlot(myInput))
}

Если вы опустите команду .packages и используйте %do% вместо этого, чтобы все это выполнялось в одном процессе, тогда работает нормально. Причина в том, что все работает в одном процессе, поэтому нет необходимости специально загружать новые пакеты.

Ответ №2

можно использовать следующее:

 install.packages("data.table")
library(data.table)

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

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

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


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

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

Вам следует проверить следующее:

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

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

  1. Если вы уверены, что установили и прикрепили / загрузили правильный пакет, введите или , чтобы получить информационное окно, в котором можно узнать, в каком пакете он содержится.
  2. и также могут использоваться для поиска функций.
  3. Если вы ничего не знаете о пакете, вы можете использовать в пакете , как описано в этом ответе.
  4. или поиск с помощью rdocumentation или rseek — это альтернативные способы поиска функции.

Иногда вам нужно использовать старую версию R, но запускать код, созданный для более новой версии. В этом случае новые добавленные функции (например, hasName в R 3.4.0) не будут найдены.Если вы используете старую версию R и хотите использовать более новую функцию, вы можете использовать backports пакета, чтобы сделать такие функции доступными. Вы также найдете список функций, которые необходимо перенести в репозиторий резервных копий git. Имейте в виду, что версии R старше R3.0.0 несовместимы с пакетами, созданными для R3.0.0 и более поздних версий.

  • Привет, Джорис, у меня быстрый вопрос. Я новичок в R, но мне удалось его успешно установить. Я хотел бы использовать функцию «cosvol» в пакете «celestial» из командной строки. В отличие от моего R, который установлен из репозитория Fedora в мою систему Linux, я загрузил свой «небесный» пакет в другой каталог в моем «доме». Каждый раз, когда я запрашиваю функцию «cosvol ()», она сообщает: «Не удалось найти функцию« cosdistCoVol »». Я не уверен, как сообщить R о моем директоре, в котором все функции загружены в моем «небесном» пакете отдельно. Ваша помощь очень ценится.
  • Если функция находится в одной из основных / базовых библиотек R, вам может потребоваться ее обновить. В моем случае я пытался использовать функцию в . Однако я использовал 3.3.1, а не было представлено до 3.4.0. Поскольку вы не можете обновить как отдельную библиотеку, R / R Studio заявила, что у меня нет библиотек для обновления.
  • @mpag Это потому, что пакет utils является неотъемлемой частью выпуска R. Если вы будете использовать RSiteSearch («hasName»), буквально первая запись — это ссылка на пакет backports, который сделает эту функцию доступной в R 3.3.1. См. Также github.com/r-lib/backports для получения дополнительной информации. Я добавил информацию для этого случая, спасибо за уведомление
  • @JorisMeys, это очень полезно. Я также хотел бы заявить, что стандартной практикой должно быть документирование добавления функции в R на странице справки по этой функции (например,? HasName). Например. ни , ни не говорят «введено в R 3.4.0». В итоге я выяснил это, просмотрев репозитории github и взглянув на для utils / R / hasName.R и base / R / match.R
  • @mpag, иначе вы могли открыть буквально первое обращение в и получить ту же информацию. Вот почему я добавил это много лет назад к этому ответу. Полезный трюк ;-)

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

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


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

> getAnywhere (plot.prcomp) Обнаружен единственный объект, соответствующий 'plot.prcomp'. Был обнаружен в следующих местах зарегистрированный метод S3 для построения графика из пространства имен stats: статистика со значением function (x, main = deparse (replace (x )), ...) screeplot.default (x, main = main, ...)  

Итак, теперь мы можем вызвать его напрямую, используя:


Я использовал как пример, чтобы проиллюстрировать цель. При обычном использовании вы не должны вызывать такие методы S3. Но, как я уже сказал, если функция, которую вы хотите вызвать, существует (например, это может быть скрытая служебная функция), но находится в , R сообщит, что не может найти функцию, если вы не укажете ему, в каком пространстве имен искать в.

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

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

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

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

  • 1 спасибо — это спасло меня после обновления до R 3 для … исправлено с вызовом вместо этого
  • Хотя это не так актуально, использование было названо ошибкой дизайна и что предпочтительнее. Не могу найти ссылку.
  • 1 @NelsonGon При всем уважении, и являются другой и ваше редактирование не Работа! Функция не экспортировано из пространства имен stats, поэтому вам нужно использовать .
  • @GavinSimpson Верно! Я взял слово уважаемого разработчика R об ошибке дизайна и никогда не проверял ее. Возможно, это было их личное мнение.

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

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

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

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

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

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


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


  • Это не удается мне в RStudio — Ошибка: ‘.’ является нераспознанным escape-символом в строке символов, начинающейся с «» ^ [^ . »
  • 1 Есть предложения, что я могу сделать, если получаю сообщение об ошибке при использовании пакета, который не писал? Сам пакет, похоже, хочет использовать внутренний метод, который не определен, потому что, по-видимому, автор этого не сделал.

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

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

происходит при выполнении проверки R CMD пакета, который я делал с помощью RStudio. Я нашел добавление

exportPattern («.»)

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

  • 1 Вам лучше использовать roxygen2, который распознает изменения, которые вы вносите в файлы пространства имен, и сохраняет их нетронутыми. Я также настоятельно не рекомендую использовать exportPattern («.») В файле пространства имен. Вместо этого используйте тег @export в своих отдельных файлах, чтобы экспортировать только те функции, которые необходимо экспортировать. Roxygen2 автоматически обновит пространство имен, чтобы экспортировать все функции, которые необходимо экспортировать.
  • 1 Джорис — я очень ценю, что вы нашли время, чтобы прокомментировать; Я на 100% согласен с тем, что вы написали. Сейчас я использую devtools / roxygen2 и добавляю во все функции, которые мне нужно экспортировать: # ‘@export

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

Функция Rcpp:
R Звонки:
выдает ошибку
нет

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

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

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

parallelStart (mode = "", N, level ="") parallelExport ("", level ="') 

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


к


  • 1 В ошибке написано «сравнение» вместо «сравнение». Я считаю, что проблема не в пространстве имен :-)
  • Хорошее место @Joris Meys

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

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

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

Понравилась статья? Поделить с друзьями:
  • Ошибка не могу найти файл setup exe
  • Ошибка не могу найти игрока 2
  • Ошибка не могу найти world of tanks
  • Ошибка не могу найти itunes
  • Ошибка не могу найти directx 5