Fout: kon functie niet vinden … in R

Dit is bedoeld als een veelgestelde vraag, dus wees zo volledig mogelijk. Het antwoord is een antwoord van de community, dus voel je vrij om te bewerken als je denkt dat er iets ontbreekt.

Deze vraag is besproken en goedgekeurd op meta.

Ik gebruik R en probeerde some.functionmaar ik kreeg de volgende foutmelding:

Error: could not find function "some.function"

Deze vraag komt heel regelmatig voor. Hoe kun je dit oplossen als je dit type fout in R krijgt?


Antwoord 1, autoriteit 100%

Er zijn een paar dingen die u moet controleren:

  1. Heb je de naam van je functie correct geschreven? Namen zijn hoofdlettergevoelig.
  2. Heb je het pakket geïnstalleerd dat de functie bevat? install.packages("thePackage")(dit hoeft maar één keer te gebeuren)
  3. Heb je dat pakket aan de werkruimte toegevoegd?
    require(thePackage)(en controleer de retourwaarde) of library(thePackage)(dit moet elke keer worden gedaan wanneer u een nieuwe R-sessie start)
  4. Gebruik je een oudere R-versie waar deze functie nog niet bestond?

Als je niet zeker weet in welk pakket die functie zit, kun je een paar dingen doen.

  1. Als u zeker weet dat u het juiste pakket hebt geïnstalleerd en bijgevoegd/geladen, typt u help.search("some.function")of ??some.functionom krijg een informatiedoos die je kan vertellen in welke verpakking het zit.
  2. finden getAnywherekunnen ook worden gebruikt om functies te lokaliseren.
  3. Als je geen idee hebt van het pakket, kun je findFngebruiken in het sos-pakket, zoals uitgelegd in dit antwoord.
  4. RSiteSearch("some.function")of zoeken met rdocumentationof rseekzijn alternatieve manieren om de functie te vinden.

Soms moet je een oudere versie van R gebruiken, maar moet je code uitvoeren die voor een nieuwere versie is gemaakt. Nieuw toegevoegde functies (bijv. hasName in R 3.4.0) worden dan niet gevonden. Als u een oudere R-versie gebruikt en een nieuwere functie wilt gebruiken, kunt u het pakket backportsom dergelijke functies beschikbaar te maken. U vindt ook een lijst met functies die moeten worden gebackporteerd op de git repo van backports. Houd er rekening mee dat R-versies ouder dan R3.0.0 niet compatibel zijn met pakketten die zijn gebouwd voor R3.0.0 en latere versies.


Antwoord 2, autoriteit 21%

Een ander probleem, in aanwezigheid van een NAMESPACE, is dat u een niet-geëxporteerde functie probeert uit te voeren vanuit pakket foo.

Bijvoorbeeld (gekunsteld, ik weet het, maar):

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

Ten eerste zou je S3-methoden niet rechtstreeks moeten aanroepen, maar laten we aannemen dat plot.prcompeigenlijk een nuttige interne functie was in pakket foo. Om een dergelijke functie aan te roepen als u weet wat u doet, is het gebruik van :::vereist. U moet ook de naamruimte weten waarin de functie wordt gevonden. Met behulp van getAnywhere()vinden we dat de functie in pakket statszit:

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

We kunnen het nu dus rechtstreeks aanroepen met:

> stats:::plot.prcomp(mod)

Ik heb plot.prcompalleen als voorbeeld gebruikt om het doel te illustreren. Bij normaal gebruik zou je S3-methoden niet op deze manier moeten aanroepen. Maar zoals ik al zei, als de functie die u wilt aanroepen bestaat (het kan bijvoorbeeld een verborgen hulpprogramma-functie zijn), maar zich in een namespacebevindt, zal R melden dat het de functie niet kan vinden tenzij je vertelt hem in welke naamruimte hij moet kijken.

Vergelijk dit met het volgende:
stats::plot.prcomp
Het bovenstaande mislukt omdat statsplot.prcompgebruikt, maar niet wordt geëxporteerd vanuit stats, zoals de fout ons terecht vertelt:

Fout: ‘plot.prcomp’ is geen geëxporteerd object uit ‘namespace:stats’

Dit is als volgt gedocumenteerd:

PKG :: Naam retourneert de waarde van de geëxporteerde variabele naam in NameSpace PKG, terwijl PKG ::: naam de waarde van de interne variabele naam retourneert.


Antwoord 3, Autoriteit 9%

Ik kan dit probleem meestal oplossen wanneer een computer onder mijn controle staat, maar het is meer last van een overlast bij het werken met een rooster. Wanneer een raster niet homogeen is, kunnen niet alle bibliotheken worden geïnstalleerd, en mijn ervaring is vaak geweest dat een pakket niet is geïnstalleerd omdat een afhankelijkheid niet was geïnstalleerd. Om dit aan te pakken, controleer ik het volgende:

  1. is fortran geïnstalleerd? (Zoek naar ‘GFORTRAN’.) Dit beïnvloedt verschillende grote pakketten in r.
  2. is Java geïnstalleerd? Zijn de Java Class Paths correct?
  3. Controleer of het pakket is geïnstalleerd door de admin en beschikbaar voor gebruik door de juiste gebruiker. Soms installeren gebruikers pakketten op de verkeerde plaatsen of worden uitgevoerd zonder de juiste toegang tot de juiste bibliotheken. .libPaths()is een goede cheque.
  4. Controleer lddRESULTATEN VOOR R, om zeker te zijn van gedeelde bibliotheken
  5. Het is goed om periodiek een script uit te voeren dat gewoon elk pakket laadt dat nodig is en wat een kleine test heeft. Dit vangt het pakket probleem zo vroeg mogelijk in de workflow. Dit is vergelijkbaar met het bouwen van testen of eenheidstests, behalve dat het meer is als een rooktest om ervoor te zorgen dat de zeer eenvoudige dingen werken.
  6. Als pakketten kunnen worden opgeslagen in een netwerk toegankelijke locatie, zijn ze dan? Als ze dat niet kunnen, is er een manier om consistente versies in de machines te garanderen? (Dit lijkt misschien OT, maar de juiste pakketinstallatie omvat beschikbaarheid van het -versie -versie.)
  7. is het pakket beschikbaar voor het gegeven OS? Helaas zijn niet alle pakketten beschikbaar op platforms. Dit gaat terug naar stap 5. Probeer indien mogelijk een manier te vinden om een ​​ander besturingssysteem te verwerken door over te schakelen naar een geschikte smaak van een pakket of de afhankelijkheid in bepaalde gevallen uitschakelt.

Nadat je dit nogal wat hebt aangetroffen, worden sommige van deze stappen vrij routine. Hoewel # 7 misschien een goed uitgangspunt lijkt, worden deze vermeld in geschatte volgorde van de frequentie die ik ze gebruik.


Antwoord 4, Autoriteit 4%

Als dit gebeurt terwijl u uw pakket controleert (RC-cheque), neem dan een kijkje op uw naamruimte.

U kunt dit oplossen door de volgende verklaring toe te voegen aan de naamruimte:

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

Deze exporteert alles wat niet begint met een punt (“.”). Hiermee kunt u uw verborgen functies hebben, beginnend met een punt:

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

Antwoord 5, Autoriteit 3%

Ik had de fout

FOUT: KON NIET FUNCTIE ZIJN some.function

Gebeurt bij het doen van R CMD-controle van een pakket dat ik maakte met Rstudio. Ik vond het toevoegen

Exportatiepatroon (“.”)

Naar het naam van het naamruimtebestand heeft de truc. Als Sidenote had ik Rstudio in eerste instantie geconfigureerd om Roxygen te gebruiken om de documentatie te maken – en de configuratie geselecteerd waar Roxygen mijn naamruimte-bestand voor mij zou schrijven, dat mijn bewerkingen bleef wissen. Dus, in mijn instantie heb ik Namespace uit de Roxygen-configuratie gecombineerd en ExportPattern (“. ‘) Toegevoegd aan NameSpace om deze fout op te lossen.


Antwoord 6, Autoriteit 3%

Deze fout kan optreden, zelfs als de naam van de functie is geldig als sommige verplichte argumenten ontbreken (dit wil zeggen dat je niet voldoende argumenten te voorzien).
Ik heb dit in een RCPP context, waarin ik schreef een C++ functie met Facultatieve argumenten en niet op voorwaarde dat die argumenten R. Het bleek dat Facultatieve argumenten van de C++ werden gezien als verplichte door R. Als gevolg daarvan kon R niet vinden een passende functie voor de juiste naam, maar een onjuist aantal argumenten.

RCPP Functie: SEXP RcppFunction(arg1, arg2=0) {}
R gesprekken:
RcppFunction(0)verhoogt de fout
RcppFunction(0, 0)niet


Antwoord 7

Rdocumentation.org heeft een zeer handige zoekfunctie die – onder andere – laat u functies -. uit alle pakketten op CRAN, evenals van pakketten van Bioconductor en GitHub


Antwoord 8

Als u parallelMapje nodig hebt om export aangepaste functies aan de slave banen, anders wordt er een fout “kan de functie niet vinden” je krijgt.

Als u een niet ontbrekende level op parallelStarthetzelfde argument moet worden doorgegeven aan parallelExportset, anders krijg je de zelfde fout. Dus dit strikt moet worden gevolgd:

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

Antwoord 9

U kunt in staat zijn om deze fout fixeren op naam afstand :: van de functie oproep

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

Naar

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

Antwoord 10

Ik heb hetzelfde, fout, ik draaide versie .99xxx, ik heb gecontroleerd op updates van Help-menu en bijgewerkt mijn RSTUDIO naar 1.0x, dan kwam de fout niet

Zo eenvoudige oplossing, update gewoon uw R-studio

Other episodes