Błąd: nie można znaleźć funkcji… w języku R

177

To ma być pytanie z najczęściej zadawanych pytań, więc prosimy o podanie możliwie kompletnych informacji. Odpowiedź jest odpowiedzią społeczności, więc jeśli uważasz, że czegoś brakuje, możesz ją edytować.

To pytanie zostało omówione i zatwierdzone na meta.

Używam języka R i próbowałem, some.functionale otrzymałem następujący komunikat o błędzie:

Error: could not find function "some.function"

To pytanie pojawia się bardzo regularnie. Kiedy otrzymujesz tego typu błąd w R, jak możesz go rozwiązać?

Joris Meys
źródło
5
Przed rozpoczęciem głosowania, aby zamknąć to pytanie, należy najpierw zapoznać się z dyskusji na Meta: meta.stackexchange.com/questions/101892/...
Andrie
2
Jeśli wszystko inne zawiedzie, spróbuj grepping kod źródłowy podstawowej R i zainstalowanych pakietów
nullglob
3
@nullglob To wydaje się nieco ekstremalne :-)
Gavin Simpson,
Mam odpowiednie pytanie: stackoverflow.com/questions/23357551/… . W tym przypadku KAŻDE Rpolecenie nie powiedzie się, ale q()! Rady będą bardzo mile widziane!
Aleksandr Blekh
Może głupie, ale uważaj, aby nie nazwać wyjścia funkcji samą funkcją. [Nauczyłem się z doświadczenia ...]
user3507584,

Odpowiedzi:

126

Należy sprawdzić kilka rzeczy:

  1. Czy poprawnie wpisałeś nazwę swojej funkcji? W nazwach rozróżniana jest wielkość liter.
  2. Czy zainstalowałeś pakiet zawierający tę funkcję? install.packages("thePackage")(wystarczy to zrobić tylko raz)
  3. Czy dołączyłeś ten pakiet do obszaru roboczego? require(thePackage)lub library(thePackage)(należy to zrobić za każdym razem, gdy rozpoczynasz nową sesję języka R)
  4. Czy używasz starszej wersji R, w której ta funkcja jeszcze nie istniała?

Jeśli nie masz pewności, w jakim pakiecie znajduje się ta funkcja, możesz zrobić kilka rzeczy.

  1. Jeśli jesteś pewien, że zainstalowałeś i dołączyłeś / załadowałeś właściwy pakiet, wpisz help.search("some.function")lub ??some.functionuzyskaj pole informacyjne, które może ci powiedzieć, w którym pakiecie się znajduje.
  2. findi getAnywheremoże być również używany do lokalizowania funkcji.
  3. Jeśli nie masz pojęcia o pakiecie, możesz użyć go findFnw sospakiecie, jak wyjaśniono w tej odpowiedzi .
  4. RSiteSearch("some.function")lub wyszukiwanie za pomocą rdocumentation lub rseek to alternatywne sposoby znajdowania funkcji.

Czasami trzeba użyć starszej wersji języka R, ale uruchomić kod utworzony dla nowszej wersji. Nowo dodane funkcje (np. HasName w R 3.4.0) nie zostaną wtedy znalezione. Jeśli używasz starszej wersji R i chcesz użyć nowszej funkcji, możesz użyć backportów pakietu, aby udostępnić takie funkcje. Znajdziesz również listę funkcji, które muszą zostać przeniesione do repozytorium git backports . Należy pamiętać, że wersje R starsze niż R3.0.0 są niekompatybilne z pakietami utworzonymi dla wersji R3.0.0 i nowszych.

Joris Meys
źródło
Cześć Joris, mam krótkie pytanie. Jestem nowy w R, ale udało mi się go pomyślnie zainstalować. Chciałbym użyć funkcji „cosvol” w pakiecie „celestial” z wiersza poleceń. W przeciwieństwie do mojego R, które jest instalowane z repozytorium Fedory do mojego systemu Linux, pobrałem pakiet „niebiański” do innego katalogu w moim „domu”. Za każdym razem, gdy żądam funkcji „cosvol ()”, pojawia się komunikat „nie można znaleźć funkcji„ cosdistCoVol ””. Nie jestem pewien, jak powiadomić R o moim reżyserze, w którym wszystkie funkcje są pobierane oddzielnie w moim pakiecie „niebiańskim”. Twoja pomoc jest doceniana.
Benjamin
Jeśli funkcja znajduje się w jednej z podstawowych / podstawowych bibliotek R, może być konieczne jej zaktualizowanie. W moim przypadku próbowałem użyć hasNamefunkcji w utils. Jednak używałem wersji 3.3.1 i hasNamenie zostałem wprowadzony do wersji 3.4.0. Ponieważ nie możesz aktualizować utilsjako samodzielna biblioteka, R / R Studio powiedziało, że nie mam żadnych bibliotek do aktualizacji.
mpag
@mpag Dzieje się tak, ponieważ pakiet narzędzi jest integralną częścią wydania R. Jeśli użyjesz RSiteSearch ("hasName") dosłownie, pierwszy wpis jest odniesieniem do pakietu backports, który udostępni tę funkcję w R 3.3.1. Więcej informacji można znaleźć na stronie github.com/r-lib/backports . Dodałem trochę informacji dla tej sprawy, dzięki za powiadomienie
Joris Meys
@JorisMeys to bardzo pomocne. Chciałbym również poinformować, że standardową praktyką powinno być dokumentowanie, kiedy funkcja została dodana do R na stronie pomocy tej funkcji (np.? HasName). Np. Ani https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNamenie https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.htmlmówię „wprowadzone w R 3.4.0”. Skończyło się na tym, że doszedłem do tego, przeglądając repozytoria github i sprawdzając blamepliki utils / R / hasName.R i base / R / match.R
mpag
@mpag lub mógłbyś otworzyć dosłownie pierwsze trafienie RSiteSearch("hasName")i uzyskać te same informacje. Dlatego dodałem to lata temu do tej odpowiedzi. Warto wiedzieć ;-)
Joris Meys
29

Innym problemem w obecności NAMESPACE jest to, że próbujesz uruchomić niewyeksportowaną funkcję z pakietu foo .

Na przykład (wymyślone, wiem, ale):

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

Po pierwsze, nie powinieneś bezpośrednio wywoływać metod S3, ale załóżmy, że plot.prcompfaktycznie była to jakaś użyteczna funkcja wewnętrzna w pakiecie foo . Aby wywołać taką funkcję, jeśli wiesz, co robisz, musisz jej użyć :::. Musisz także znać przestrzeń nazw, w której znajduje się funkcja. Używając getAnywhere(), stwierdzamy, że funkcja znajduje się w statystykach pakietu :

> 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>

Więc możemy teraz wywołać to bezpośrednio za pomocą:

> stats:::plot.prcomp(mod)

Użyłem plot.prcomptylko przykładu, aby zilustrować cel. W normalnym użytkowaniu nie powinieneś wywoływać takich metod S3. Ale jak powiedziałem, jeśli funkcja, którą chcesz wywołać, istnieje (na przykład może to być ukryta funkcja narzędzia), ale znajduje się w a namespace, R zgłosi, że nie może znaleźć funkcji, chyba że powiesz mu, w której przestrzeni nazw ma szukać .

Porównaj to z następującym: stats::plot.prcomp Powyższe zawodzi, ponieważ podczas statsużywania plot.prcompnie jest eksportowane z, statsjak słusznie mówi nam błąd:

Błąd: „plot.prcomp” nie jest wyeksportowanym obiektem z „namespace: stats”

Jest to udokumentowane w następujący sposób:

pkg :: name zwraca wartość nazwy wyeksportowanej zmiennej w przestrzeni nazw pkg, natomiast pkg ::: name zwraca wartość nazwy zmiennej wewnętrznej.

Gavin Simpson
źródło
1
dzięki - to uratowało mnie po uaktualnieniu do R 3 na could not find function "anova.lm"... naprawiono z dzwonieniem stats:::anova.lm()zamiast tego
ErichBSchulz
Chociaż nie jest to tak istotne, użycie :::jest określane jako błąd projektowy i ::jest to preferowane. Nie można łatwo znaleźć odniesienia.
NelsonGon
1
@NelsonGon Z całym szacunkiem, ::i :::różni a edycja nie działa ! plot.prcomp()Funkcja nie jest wywożone z obszaru nazw status więc trzeba użyć :::.
Gavin Simpson
@GavinSimpson Right! Wziąłem słowo szanowanego dewelopera R&D za błąd projektowy i nigdy go tak naprawdę nie zweryfikowałem. Być może była to ich osobista opinia.
NelsonGon
11

Zwykle mogę rozwiązać ten problem, gdy komputer jest pod moją kontrolą, ale jest to bardziej uciążliwe podczas pracy z siecią. Gdy siatka nie jest jednorodna, nie wszystkie biblioteki mogą zostać zainstalowane, a z mojego doświadczenia często wynika, że ​​pakiet nie został zainstalowany, ponieważ zależność nie została zainstalowana. Aby rozwiązać ten problem, sprawdzam następujące kwestie:

  1. Czy jest zainstalowany Fortran? (Poszukaj 'gfortran'). Dotyczy to kilku głównych pakietów w R.
  2. Czy jest zainstalowana Java? Czy ścieżki klas Java są poprawne?
  3. Sprawdź, czy pakiet został zainstalowany przez administratora i dostępny do użytku przez odpowiedniego użytkownika. Czasami użytkownicy instalują pakiety w niewłaściwych miejscach lub uruchamiają się bez odpowiedniego dostępu do odpowiednich bibliotek. .libPaths()to dobry czek.
  4. Sprawdź lddwyniki dla R, aby mieć pewność co do bibliotek współdzielonych
  5. Dobrze jest okresowo uruchamiać skrypt, który po prostu ładuje każdy potrzebny pakiet i wykonuje mały test. To wychwytuje problem z pakietem na jak najwcześniejszym etapie przepływu pracy. Jest to podobne do testów budowania lub testów jednostkowych, z tym wyjątkiem, że jest to bardziej jak test dymny, aby upewnić się, że bardzo podstawowe rzeczy działają.
  6. Jeśli pakiety można przechowywać w lokalizacji dostępnej w sieci, czy tak jest? Jeśli nie, czy istnieje sposób na zapewnienie spójnych wersji na wszystkich maszynach? (Może się to wydawać OTW, ale poprawna instalacja pakietu obejmuje dostępność odpowiedniej wersji).
  7. Czy pakiet jest dostępny dla danego systemu operacyjnego? Niestety nie wszystkie pakiety są dostępne na różnych platformach. Wracamy do kroku 5. Jeśli to możliwe, spróbuj znaleźć sposób obsługi innego systemu operacyjnego, przełączając się na odpowiedni pakiet lub wyłączając zależność w niektórych przypadkach.

Po dość częstym napotkaniu tego, niektóre z tych kroków stają się dość rutynowe. Chociaż # 7 może wydawać się dobrym punktem wyjścia, są one wymienione w przybliżonej kolejności częstotliwości, z jaką ich używam.

Iterator
źródło
2
Dla pewności przydatne uwagi, ale bardziej odpowiedź na pytanie „Dlaczego pojawia się błąd podczas instalowania pakietu”.
IRTFM
@DWin: Może, ale nie do końca. Mogłem być niejasny. Te problemy pojawiają się, gdy zadanie zatrzymuje się w sieci, ponieważ pakiet nie został zainstalowany. Utrzymanie spójności oprogramowania w sieci nie jest trudne, ale wymaga dobrego procesu instalacji, konserwacji i debugowania. To tylko niektóre elementy, które pojawiają się w każdej fazie, przynajmniej w odniesieniu do odgłosu krzyku, który pojawia się, gdy funkcja nie jest dostępna. :)
Iterator
6

Jeśli zdarzy się to podczas sprawdzania paczki (kontrola R CMD), spójrz na NAMESPACE.

Możesz rozwiązać ten problem, dodając następującą instrukcję do NAMESPACE:

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

Spowoduje to wyeksportowanie wszystkiego, co nie zaczyna się od kropki („.”). Dzięki temu możesz mieć ukryte funkcje, zaczynając od kropki:

.myHiddenFunction <- function(x) cat("my hidden function")
Jacob
źródło
To się nie udaje w RStudio - Błąd: „\”. to nierozpoznana zmiana znaczenia w ciągu znaków rozpoczynającym się od „" ^ [^ \. "
Andrew
1
Jakieś sugestie, co mogę zrobić, jeśli wystąpi błąd podczas korzystania z pakietu, którego nie napisałem? Wydaje się, że sam pakiet chce użyć wewnętrznej metody, która nie jest zdefiniowana, ponieważ przypuszczalnie autor nie zrobił tego powyżej.
Andre Luus
4

Miałem błąd

Błąd: nie można znaleźć funkcji some.function

dzieje się podczas sprawdzania R CMD pakietu, który tworzyłem za pomocą RStudio. Znalazłem dodawanie

exportPattern („.”)

do pliku NAMESPACE załatwiło sprawę. Na marginesie, początkowo skonfigurowałem RStudio do używania ROxygen do tworzenia dokumentacji - i wybrałem konfigurację, w której ROxygen zapisałby dla mnie mój plik NAMESPACE, który nadal kasował moje zmiany. Tak więc w moim przypadku odznaczyłem NAMESPACE w konfiguracji Roxygen i dodałem exportPattern („.”) Do NAMESPACE, aby rozwiązać ten błąd.

swihart
źródło
1
Lepiej użyj roxygen2, który rozpoznaje zmiany wprowadzone w plikach przestrzeni nazw i zachowuje je nienaruszone. Zdecydowanie odradzam również używanie elementu exportPattern („.”) W pliku przestrzeni nazw. Zamiast tego użyj tagu @export w swoich indywidualnych plikach, aby wyeksportować tylko te funkcje, które wymagają eksportu. Roxygen2 automatycznie zaktualizuje przestrzeń nazw, aby wyeksportować wszystkie funkcje, które wymagają eksportu.
Joris Meys
1
Joris - naprawdę doceniam, że poświęciłeś czas na komentarz; Zgadzam się w 100% z tym, co napisałeś. Teraz używam devtools / roxygen2 i umieszczam następujące elementy we wszystkich funkcjach, których potrzebuję, aby wyeksportować: # '@export
swihart
4

Ten błąd może wystąpić, nawet jeśli nazwa funkcji jest prawidłowa, jeśli brakuje niektórych obowiązkowych argumentów (tj. Nie podano wystarczającej liczby argumentów).
Otrzymałem to w kontekście Rcpp, gdzie napisałem funkcję C ++ z argumentami opcjonalnymi i nie podałem tych argumentów w R. Okazało się, że argumenty opcjonalne z C ++ były postrzegane jako obowiązkowe przez R. W rezultacie R nie mógł znaleźć pasująca funkcja dla poprawnej nazwy, ale niepoprawna liczba argumentów.

Funkcja Rcpp: SEXP RcppFunction(arg1, arg2=0) {}
R Wywołania:
RcppFunction(0)wywołuje błąd
RcppFunction(0, 0)nie

Math
źródło
2

Rdocumentation.org ma bardzo przydatną funkcję wyszukiwania, która - między innymi - pozwala znaleźć funkcje - ze wszystkich pakietów w CRAN, a także z pakietów z Bioconductor i GitHub.

wprowadź opis obrazu tutaj

maj
źródło
1

Jeśli używasz parallelMap, musisz wyeksportować niestandardowe funkcje do zadań podrzędnych, w przeciwnym razie pojawi się błąd „nie można znaleźć funkcji”.

Jeśli ustawisz nie brakujący poziom parallelStarttego samego argumentu, należy go przekazać parallelExport, w przeciwnym razie otrzymasz ten sam błąd. Dlatego należy ściśle przestrzegać:

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
katastrofalna awaria
źródło
0

Możesz być w stanie naprawić ten błąd, stosując odstępy między nazwami: wywołanie funkcji

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

do

wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)
Tony Cronin
źródło
1
Błąd mówi „porównanie” zamiast „porównanie”. Myślę, że przestrzeń nazw nie była problemem :-)
Joris Meys
Dobre miejsce @ Joris Meys
Tony Cronin
-1

Mam ten sam błąd, pracowałem w wersji .99xxx, sprawdziłem aktualizacje z menu pomocy i zaktualizowałem Moje RStudio do 1.0x, to błąd nie nadszedł

Tak proste rozwiązanie, wystarczy zaktualizować R Studio

Akshay Vijay Jain
źródło
1
Czy mógłby Pan wyjaśnić, jaka była natura błędu. Może to pomóc, ale tylko w bardzo szczególnych przypadkach.
Joris Meys