Errore: impossibile trovare la funzione ... in R


178

Questa dovrebbe essere una domanda frequente, quindi si prega di essere il più completo possibile. La risposta è una risposta della comunità, quindi sentiti libero di modificare se pensi che manchi qualcosa.

Questa domanda è stata discussa e approvata su meta.

Sto usando R e some.functionho provato ma ho ricevuto il seguente messaggio di errore:

Error: could not find function "some.function"

Questa domanda viene posta molto regolarmente. Quando ricevi questo tipo di errore in R, come puoi risolverlo?


5
Prima di votare per chiudere questa domanda, leggi prima questa discussione su meta: meta.stackexchange.com/questions/101892/…
Andrie

2
Se tutto il resto fallisce, prova a grepping il codice sorgente per la base R e i pacchetti installati
nullglob

3
@nullglob Sembra un po 'estremo :-)
Gavin Simpson l'

Ho una domanda pertinente: stackoverflow.com/questions/23357551/… . In questo caso, QUALSIASI Rcomando fallisce, ma q()! Il consiglio sarà molto apprezzato!
Aleksandr Blekh,

Forse sciocco, ma fai attenzione a non nominare l'output della funzione come funzione stessa. [Imparato dall'esperienza ...]
user3507584

Risposte:


126

Ci sono alcune cose che dovresti controllare:

  1. Hai scritto correttamente il nome della tua funzione? I nomi fanno distinzione tra maiuscole e minuscole.
  2. Hai installato il pacchetto che contiene la funzione? install.packages("thePackage")(questo deve essere fatto solo una volta)
  3. Hai allegato quel pacchetto allo spazio di lavoro? require(thePackage)o library(thePackage)(questo dovrebbe essere fatto ogni volta che inizi una nuova sessione R)
  4. Stai utilizzando una versione R precedente in cui questa funzione non esisteva ancora?

Se non sei sicuro di quale pacchetto si trova quella funzione, puoi fare alcune cose.

  1. Se sei sicuro di aver installato e allegato / caricato il pacchetto giusto, digita help.search("some.function")o ??some.functionper ottenere una finestra informativa che ti dirà in quale pacchetto è contenuto.
  2. finde getAnywherepuò anche essere usato per localizzare le funzioni.
  3. Se non si ha idea del pacchetto, è possibile utilizzare findFnnel sospacchetto come spiegato in questa risposta .
  4. RSiteSearch("some.function")o la ricerca con rdocumentation o rseek sono modi alternativi per trovare la funzione.

A volte è necessario utilizzare una versione precedente di R, ma eseguire il codice creato per una versione più recente. Le funzioni appena aggiunte (ad es. HasName in R 3.4.0) non saranno trovate allora. Se si utilizza una versione R precedente e si desidera utilizzare una funzione più recente, è possibile utilizzare i backport del pacchetto per rendere disponibili tali funzioni. È inoltre disponibile un elenco di funzioni che è necessario eseguire il backport nel repository git dei backport . Tieni presente che le versioni R precedenti a R3.0.0 sono incompatibili con i pacchetti creati per R3.0.0 e versioni successive.


Ciao Joris, ho una domanda veloce. Sono nuovo in R ma sono stato in grado di installarlo con successo. Vorrei usare la funzione "cosvol" nel pacchetto "celeste" dalla riga di comando. A differenza della mia R che è installata dal repository Fedora nel mio sistema Linux, ho scaricato il mio pacchetto "celeste" in una directory diversa nella mia "casa". Ogni volta che sto richiedendo la funzione "cosvol ()", dice "non sono riuscito a trovare la funzione" cosdistCoVol "." Non sono sicuro di come far sapere a R del mio regista in cui tutte le funzioni sono scaricate separatamente nel mio pacchetto "celeste". Il tuo aiuto è apprezzato.
Benjamin,

Se la funzione si trova in una delle librerie core / base R, potrebbe essere necessario aggiornarla. Nel mio caso, stavo cercando di usare la hasNamefunzione in utils. Tuttavia, stavo usando 3.3.1 e hasNamenon fu introdotto fino alla 3.4.0. Poiché non è possibile eseguire l'aggiornamento utilscome libreria autonoma, R / R Studio ha affermato che non avevo librerie da aggiornare.
mpag,

@mpag Questo perché il pacchetto utils è parte integrante della versione R. Se dovessi usare RSiteSearch ("hasName") letteralmente, la prima voce è un riferimento al pacchetto backports che renderà disponibile quella funzione in R 3.3.1. Vedi anche github.com/r-lib/backports per maggiori informazioni. Ho aggiunto alcune informazioni per quel caso, grazie per la notifica
Joris Meys,

@JorisMeys è molto utile. Vorrei anche presentare che dovrebbe essere pratica standard documentare quando una funzione è stata aggiunta a R nella pagina di aiuto di quella funzione (ad esempio? HasName). Ad esempio https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNamehttps://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.htmldetto né "introdotto in R 3.4.0" ho finito per blamecapirlo sfogliando i repository di github e guardando i programmi utils / R / hasName.R e base / R / match.R
mpag del

@mpag o avresti potuto aprire letteralmente il primo hit RSiteSearch("hasName")e ottenere le stesse informazioni. Ecco perché l'ho aggiunto anni fa a quella risposta. È un trucco utile da sapere ;-)
Joris Meys,

29

Un altro problema, in presenza di NAMESPACE, è che si sta tentando di eseguire una funzione non esportata dal pacchetto pippo .

Ad esempio (inventato, lo so, ma):

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

In primo luogo, non dovresti chiamare direttamente i metodi S3, ma supponiamo che in plot.prcomprealtà fosse una utile funzione interna nel pacchetto pippo . Per chiamare tale funzione se sai cosa stai facendo richiede l'uso di :::. È inoltre necessario conoscere lo spazio dei nomi in cui si trova la funzione. Usando getAnywhere()troviamo che la funzione è nelle statistiche del pacchetto :

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

Quindi ora possiamo chiamarlo direttamente usando:

> stats:::plot.prcomp(mod)

Ho usato plot.prcompsolo come esempio per illustrare lo scopo. Nell'uso normale non dovresti chiamare metodi S3 come questo. Ma come ho detto, se esiste la funzione che si desidera chiamare (ad esempio potrebbe essere una funzione di utilità nascosta), ma è in a namespace, R segnalerà che non è possibile trovare la funzione a meno che non si indichi in quale spazio dei nomi cercare .

Confrontalo con il seguente: stats::plot.prcomp Quanto sopra fallisce perché, mentre statsutilizza plot.prcomp, non viene esportato statscome l'errore ci dice giustamente:

Errore: "plot.prcomp" non è un oggetto esportato da "namespace: stats"

Questo è documentato come segue:

pkg :: name restituisce il valore del nome della variabile esportata nello spazio dei nomi pkg, mentre pkg ::: name restituisce il valore del nome della variabile interna.


1
grazie - questo mi ha salvato dopo l'aggiornamento a R 3 per could not find function "anova.lm"... risolto con la chiamata stats:::anova.lm()invece
ErichBSchulz

Sebbene non sia rilevante, l'uso di :::è stato indicato come un errore di progettazione e questo ::è preferito. Impossibile trovare rapidamente il riferimento.
NelsonGon

1
@NelsonGon Con tutto il rispetto ::e :::sono diversi e la tua modifica non funziona ! La plot.prcomp()funzione non viene esportata dallo spazio dei nomi delle statistiche, quindi è necessario utilizzarla :::.
Gavin Simpson

@GavinSimpson Giusto! Ho preso la parola di un devoto R rispettato per l'errore di progettazione e non l'avevo mai verificato. Forse, era la loro opinione personale.
NelsonGon

11

Di solito posso risolvere questo problema quando un computer è sotto il mio controllo, ma è più fastidioso quando si lavora con una griglia. Quando una griglia non è omogenea, non tutte le librerie possono essere installate e la mia esperienza è stata che un pacchetto non è stato installato perché non è stata installata una dipendenza. Per risolvere questo problema, controllo quanto segue:

  1. Fortran è installato? (Cerca 'gfortran'.) Questo riguarda diversi pacchetti importanti in R.
  2. Java è installato? I percorsi di classe Java sono corretti?
  3. Verificare che il pacchetto sia stato installato dall'amministratore e disponibile per l'uso da parte dell'utente appropriato. A volte gli utenti installeranno i pacchetti nei posti sbagliati o eseguiranno senza un accesso appropriato alle librerie giuste. .libPaths()è un buon controllo.
  4. Controlla i lddrisultati per R, per essere sicuro delle librerie condivise
  5. È utile eseguire periodicamente uno script che carica solo tutti i pacchetti necessari e fa alcuni piccoli test. Questo risolve il problema del pacchetto il più presto possibile nel flusso di lavoro. È simile a costruire test o test unitari, tranne per il fatto che è più simile a un test del fumo per assicurarsi che le cose di base funzionino.
  6. Se i pacchetti possono essere archiviati in una posizione accessibile dalla rete, lo sono? In caso contrario, esiste un modo per garantire versioni coerenti tra le macchine? (Questo può sembrare OT, ma l'installazione corretta del pacchetto include la disponibilità della versione corretta .)
  7. Il pacchetto è disponibile per il sistema operativo specificato? Sfortunatamente, non tutti i pacchetti sono disponibili su tutte le piattaforme. Torna al passaggio 5. Se possibile, prova a trovare un modo per gestire un sistema operativo diverso passando a un sapore appropriato di un pacchetto o disattiva la dipendenza in alcuni casi.

Avendo riscontrato questo un bel po ', alcuni di questi passaggi diventano abbastanza ordinari. Sebbene # 7 possa sembrare un buon punto di partenza, questi sono elencati in ordine approssimativo della frequenza che li uso.


2
Considerazioni utili per essere sicuri, ma più una risposta per "Perché ricevo un errore durante l'installazione di un pacchetto".
IRTFM,

@DWin: forse, ma non proprio. Potrei essere stato poco chiaro. Questi problemi sorgono quando un lavoro si interrompe su una griglia perché non è stato installato un pacchetto. Mantenere la coerenza del software su una griglia non è difficile, ma richiede un buon processo per l'installazione, la manutenzione e il debug. Questi sono solo alcuni degli elementi che emergono da ogni fase, almeno per quanto riguarda il suono da urlo che arriva quando una funzione non è disponibile. :)
Iteratore

6

Se ciò si verifica mentre controlli il tuo pacchetto (controllo R CMD), dai un'occhiata a NAMESPACE.

È possibile risolvere questo problema aggiungendo la seguente istruzione a NAMESPACE:

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

Questo esporta tutto ciò che non inizia con un punto ("."). Ciò ti consente di avere le tue funzioni nascoste, iniziando con un punto:

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

Questo non riesce per me in RStudio - Errore: '\.' è una fuga non riconosciuta nella stringa di caratteri che inizia "" ^ [^ \. "
Andrew,

1
Qualche suggerimento su cosa potrei fare se visualizzo l'errore mentre utilizzo un pacchetto che non ho scritto? Il pacchetto stesso sembra voler usare un metodo interno che non è definito perché presumibilmente l'autore non ha fatto quanto sopra.
Andre Luus,

4

Ho avuto l'errore

Errore: impossibile trovare la funzione some.function

accade quando si esegue il controllo R CMD di un pacchetto che stavo realizzando con RStudio. Ho trovato l'aggiunta

exportPattern ( "")

al file NAMESPACE ha fatto il trucco. Come sidenote, inizialmente avevo configurato RStudio per utilizzare ROxygen per creare la documentazione e avevo selezionato la configurazione in cui ROxygen avrebbe scritto il mio file NAMESPACE per me, che continuava a cancellare le mie modifiche. Quindi, nel mio caso, ho deselezionato NAMESPACE dalla configurazione di Roxygen e ho aggiunto exportPattern (".") A NAMESPACE per risolvere questo errore.


1
È meglio usare roxygen2, ovvero riconoscere le modifiche apportate ai file dello spazio dei nomi e mantenerle intatte. Vorrei anche sconsigliare di utilizzare exportPattern (".") Nel file dello spazio dei nomi. Usa invece il tag @export nei tuoi singoli file, quindi esporti solo le funzioni che devono essere esportate. Roxygen2 aggiornerà automaticamente lo spazio dei nomi per esportare tutte le funzioni che devono essere esportate.
Joris Meys,

1
Joris - Apprezzo davvero che tu abbia dedicato del tempo a commentare; Sono d'accordo al 100% con quello che hai scritto. Ora sto usando devtools / roxygen2 e sto inserendo quanto segue in tutte le funzioni che ho bisogno di esportare: # '@export
swihart

4

Questo errore può verificarsi anche se il nome della funzione è valido se mancano alcuni argomenti obbligatori (ovvero non hai fornito argomenti sufficienti).
Ho ottenuto questo in un contesto Rcpp, dove ho scritto una funzione C ++ con argomenti opzionali e non ho fornito quegli argomenti in R. Sembrava che gli argomenti opzionali dal C ++ fossero visti come obbligatori da R. Di conseguenza, R non riuscì a trovare una funzione corrispondente per il nome corretto ma un numero errato di argomenti.

Funzione Rcpp: SEXP RcppFunction(arg1, arg2=0) {}
R Chiamate:
RcppFunction(0)genera l'errore
RcppFunction(0, 0)no


2

Rdocumentation.org ha una funzione di ricerca molto utile che - tra le altre cose - ti consente di trovare funzioni - da tutti i pacchetti su CRAN, nonché dai pacchetti di Bioconductor e GitHub.

inserisci qui la descrizione dell'immagine


1

Se si sta utilizzando, parallelMapè necessario esportare funzioni personalizzate nei lavori slave, altrimenti si ottiene un errore "Impossibile trovare la funzione".

Se si imposta un livello non mancante sullo parallelStartstesso argomento deve essere passato parallelExport, altrimenti si ottiene lo stesso errore. Quindi questo dovrebbe essere rigorosamente seguito:

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

0

Potresti essere in grado di correggere questo errore in base allo spazio dei nomi :: la chiamata di funzione

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

per

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

1
L'errore dice "confronto" anziché "confronto". Credo che lo spazio dei nomi non sia stato il problema :-)
Joris Meys il

Buon posto @Joris Meys
Tony Cronin,

-1

Ho avuto lo stesso errore, stavo eseguendo la versione .99xxx, ho controllato gli aggiornamenti dal menu di aiuto e ho aggiornato My RStudio a 1.0x, quindi l'errore non è arrivato

Soluzione così semplice, basta aggiornare R Studio


1
Potresti per favore approfondire quale fosse la natura dell'errore. Questo potrebbe aiutare, ma solo in casi molto specifici.
Joris Meys,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.