2013-02-11 5 views
6

Ich habe ein Paket, das die tmPlot Funktion von treemap verwendet, aber wenn ich versuche, die Funktion zu nutzen, wirft es einen Fehler, dass eine ihrer Abhängigkeiten nicht geladen:tmPlot ist im Namensraum, aber seine Abhängigkeiten nicht gefunden

Error in tmPlot(data, index = index, vSize = vSize) : 
    could not find function "brewer.pal" 

Die Abhängigkeit ist installiert und im Namespace.

Diese Frage hat ein wenig von Setup, ein Paket Problem zu sein, aber ich habe versucht, es so minimal wie möglich zu machen:

Stellen Sie sicher, Sie haben treemap (und alle seine Abhängigkeiten) installiert.

Ich habe ein Verzeichnis namens "anRpackage" gemacht. Innen ist es ein Ordner (‚R‘) und eine Beschreibungsdatei mit dem folgenden Text ist:

Package: anRpackage 
Title: What the package does (short line) 
Version: 1.0 
Author: Who wrote it 
Maintainer: Who to complain to <[email protected]> 
Description: More about what it does (maybe more than one line) 
License: What license is it under? 
Imports: 
    treemap 
Collate: 
    'maketree.R' 

Innerhalb des R/Ordners ist eine einzige R Datei ‚maketree.R‘ genannt. Sein Inhalt sind:

#' maketree 
#' 
#' @importFrom treemap tmPlot 
#' @export maketree 

maketree <- 
function(data, index, vSize){ 
    tmPlot(data, index=index, vSize=vSize) 
} 

Angenommen, Sie in das Verzeichnis über 'anRpackage' sind, führen Sie das folgende Skript:

library(roxygen2) 
roxygenise("anRpackage/") 

library(devtools) 

build("anRpackage") 
install("anRpackage") 

Restart R (vorzugsweise mit --vanilla) und Lauf die folgenden:

library(anRpackage) 

data(mtcars) 
maketree(mtcars, "cyl", "mpg") 

Sie sollten den Fehler ich beschrieben direkt zu Beginn ning. Warum passiert das? RColorBrewer wird als abhängig von treemap aufgeführt, so sollte es automatisch importiert werden, sollte es nicht?

+0

Try 'Import RColorBrewer' hinzufügen. Dieses Paket wird möglicherweise nicht automatisch von 'treemap' geladen, oder vielleicht tut es das, aber das Aufrufen von nur einer Funktion aus der Baumstruktur ruft 'RColorBrewer' nicht auf. –

+1

@TylerRinker Es ist nicht so sehr, dass ich irgendeine Lösung für das Problem möchte (das Problem kann einfach durch Hinzufügen von 'Bibliothek (Treemap)' in der Funktion behoben werden). Es ist mehr, dass ich wissen möchte, warum dieses Problem hier passiert, wenn es nach meinem Verständnis nicht passieren sollte. Ich verstehe nicht, warum einige Pakete manuell geladen werden müssen und andere nicht. –

Antwort

10

Das Problem ist wirklich mit treemap. treemap verwendet brewer.pal, und so sollten Imports: RColorBrewer und importFrom(RColorBrewer, brewer.pal).

Wie es jetzt aussieht, ist alles in Ordnung, wenn der Benutzer sagt library(treemap), treemap und RColorBrewer zum search() Pfad angebracht sind, und wenn tmPlotbrewer.pal ausgewertet wird, wird auf dem Suchpfad gefunden. Natürlich würde das Paket brechen, wenn der Benutzer brewer.pal="yeast" oder so sagen würde, weil das falsche Symbol gefunden würde; Dies ist einer der Gründe für einen Namensraum, um treemap-Funktionen davor zu schützen, was der Benutzer tun könnte.

Aber was passiert wenn man (richtig) importiert: Treemap? Treemap ist geladen (in den Speicher), aber weder Treemap noch seine Abhängigkeiten sind angehängt (zum Suchpfad). Also brewer.pal wird nicht gefunden.

Wenn treemap importieren wäre: RColorBrewer, dann brewer.pal würde sowohl gefunden werden, wenn Treemap durch einen Aufruf an library(treemap) an den Suchpfad angehängt wurde, und wenn nur in Ihr Paket importiert.

Wenden Sie sich an den Betreuer der Treemap und bitten Sie sie, ihren Namensraum sorgfältiger zu konstruieren.

+2

Sehr schön erklärt. Ich muss mit ein paar Paketbetreuern nur mit dieser Anfrage Kontakt aufnehmen und mich fragen, ob es ein kanonisches Dokument gibt, auf das sie verweisen können - etwas besonders Gutes in den R-Dokumenten, auf der CRAN-Website oder dem R-devel-Listen-Dienst. Jetzt kann ich nur Ihre Antwort verwenden. Vielen Dank. –

+0

Einverstanden, nette Erklärung +1 –

+0

Also ist das Hauptproblem, dass sie Depends lieber als Importe oder dass ihre NAMESPACE die entsprechenden Aussagen fehlt? –

0

Ich denke, es ist aufgrund der Tatsache, dass Sie Imports anstelle von Depends in Ihrer DESCRIPTION Datei verwenden.

Wenn Sie Depends: treemap verwenden, wird das treemap-Paket geladen und angehängt, wenn Sie Ihr Paket laden, und so werden auch die treemap-Abhängigkeiten geladen. Wenn Sie Imports: treemap verwenden, wird nur der angegebene Namespace importiert, dh Sie können die Variablen treemap in Ihren Funktionen verwenden. Aber es scheint, dass in diesem Fall die treemap Abhängigkeiten nicht geladen sind.

Also ich denke, man entweder Depends: treemap verwenden sollten (aber es scheint, dass die Verwendung von Imports in diesen Tagen gefördert wird), oder importieren RColorBrewer direkt von Ihrem Paket.

Leider nicht sicher, dass diese Antworten wirklich Ihre Frage, und Sie können bereits perfekt all diese Punkte bewusst sein ...

1

vor der tmPlot (Daten, Index = Index, vsize = vsize) aufrufen, müssen Sie RColorBrewer laden:

erfordern (RColorBrewer)

Verwandte Themen