2015-01-13 8 views
22

Wahrscheinlich eine ziemlich grundlegende Frage, aber ein Freund und ich habe versucht, str(packge_name) laufen und R warf uns einen Fehler. Jetzt, wo ich es anschaue, frage ich mich, ob ein R-Paket wie eine .zip-Datei ist, da es sich um eine Sammlung von Objekten handelt, also um Bilder und Songs, aber nicht um ein Bild oder einen Song.Welcher Objekttyp ist ein R-Paket?

Wenn ich versuchte, eine Zip von Bildern mit einem Bildbetrachter zu öffnen, würde es nicht wissen, was zu tun ist, bis ich es entzippte - genau wie ich str(forecast) anrufen kann, aber ich kann str(ts) aufrufen, sobald ich geladen habe Vorschau Paket in meine Bibliothek ...

Kann mir jemand mich gerade setzen?

+4

Sie könnten mehr beeindruckt sein mit 'ls.str (" package: packageName ")' –

+5

Ein Paket ist nur ein Bündel von R-Funktionen (mit Dokumentation) zusammengeklebt und organisiert von DESCRIPTION und NAMESPACE-Dateien. Ein Paket selbst ist kein R-Objekt. – Roland

+0

Nun, manchmal mehr als streng funktioniert. Manchmal gibt es auch Datensätze und andere Nichtfunktionsobjekte, die notwendig sind, damit das Paket –

Antwort

22

R-Pakete werden im Allgemeinen als komprimierte Dateipakete verteilt. Sie können entweder in binärer Form vorliegen, die in einem Repository vorverarbeitet werden, um eine C- oder Fortran-Quelle zu kompilieren und die richtigen Header zu erstellen, oder sie können in Quellform vorliegen, in der die verschiedenen erforderlichen Dateien für den Installationsprozess verfügbar sind. Dies erfordert jedoch, dass die Benutzer die erforderlichen Compiler und Tools an Stellen installiert haben, an denen der R-Build-Prozess unter Verwendung von Betriebssystemressourcen auf sie zugreifen kann.

Wenn Sie die Dokumentation für ein Paket bei CRAN lesen Sie sehen, dass sie in der Serie von komprimierten Formaten verteilt werden, die auf den OS-Zielen variieren je:

Package source:  Rcpp_0.11.3.tar.gz # the Linus/UNIX targets 
Windows binaries: r-devel: Rcpp_0.11.3.zip, r-release: Rcpp_0.11.3.zip, r-oldrel: Rcpp_0.11.3.zip 
OS X Snow Leopard binaries:  r-release: Rcpp_0.11.3.tgz, r-oldrel: Rcpp_0.11.3.tgz 
OS X Mavericks binaries: r-release: Rcpp_0.11.3.tgz 
Old sources: Rcpp archive # not really a file but a web link 

Sobald ein R-Paket installiert wird ein angegebenes Verzeichnis Struktur. Die DESCRIPTION-Datei ist eine Textdatei mit spezifischen Einträgen für Komponenten, die bestimmen, ob die lokale Installation die Abhängigkeiten des Pakets erfüllt. Es gibt NAMESPACE-, LICENSE- und INDEX-Dateien. Es gibt Verzeichnisse mit den Namen '/ help', '/ html', '/ Meta', '/ R' und möglicherweise '/ libs', '/ demo', '/ data', '/ unitTests' und andere.

Dies ist der Baum an der Spitze des ../library/Rcpp Paketverzeichnis:

$ ls 
CITATION NAMESPACE THANKS  examples libs 
DESCRIPTION NEWS.Rd  announce help  prompt 
INDEX  R  discovery html  skeleton 
Meta  README  doc  include  unitTests 

So in der „Lebenszyklus“ eines Pakets wird es erforderliche und optionale Dateien, zunächst eine Reihe von der dann sein werden von den BUILD- und CHECK-Mechanismen in ein installiertes Paket verarbeitet, das dann für die Verteilung komprimiert und später in eine angegebene Verzeichnisstruktur auf dem Benutzercomputer entpackt wird. Sehen Sie diese Hilfeseiten:

?.libPaths # also describes .Library() 
?package.skeleton 
?install.packages 
?INSTALL 

Und natürlich Schreiben R Extensions lesen, Dokumente, die Schiffe mit jeder Installation von R.

+1

Boom. Epische Antwort - vielen Dank. – d8aninja

4

Ich lese Hadley Buch Advanced-R (Kapitel 6.3 - Funktionen, S.79) und dieses Zitat decken Sie denke ich:

Every operation is a function call 
“To understand computations in R, two slogans are helpful: 

Everything that exists is an object. 
Everything that happens is a function call." 
— John Chambers 

Nach dieser mit library(name_of_library) ist ein Funktionsaufruf, der das Paket geladen wird, . Jedes Bit, das geladen wurde, d. H. Funktionen oder Datensätze, sind objects, die Sie verwenden können, indem Sie andere Funktionen aufrufen. In diesem Sinne ist ein Paket nicht ein object in einer der Umgebungen von R, bis es geladen ist. Dann können Sie sagen, dass es eine Sammlung der objects enthält und welche geladen werden.

+0

Etwas nach dem, wonach ich suche, aber warum würde str (Paketname) einen Fehler ausgeben, wenn str "Kompakt die interne Struktur eines R-Objekts anzeigen soll" – d8aninja

+1

Weil Es geht um die "Umgebungen". Sie müssen sich den obigen Link im Kapitel "Umgebungen" ansehen. Wenn Sie ein Paket laden, wird seine 'Umgebung' vor der globalen Umgebung in einer Menge von 'Umgebungen' hinzugefügt. Die "Umgebungen" sind praktisch, wo R nach jedem Objekt sucht. Wenn Sie kein 'Paket 'laden, kann R nicht finden, wo dieser Name ist, und daher erhalten Sie einen Fehler. – LyzandeR

+3

Ich glaube nicht, dass dieses Zitat OP wirklich hilft. Tatsächlich ist es tatsächlich ziemlich irreführend, weil "alles, was existiert, ein Objekt ist", aber trotz gegenteiliger Erscheinungen existiert der 'Paketname' in' str (Paketname) 'nicht * soweit es R betrifft (und isn ' t ein Objekt), es sei denn, OP hat es zuvor definiert. –

5

Von R's own documentation:

Pakete stellen einen Mechanismus für optionalen Code laden, Daten und Dokumentation nach Bedarf ... Ein Paket ein Verzeichnis von Dateien ist die R erweitern, ein Quellpaket (die Master-Dateien. ein Paket) oder ein Tarball mit den Dateien eines Quellpakets oder ein installiertes Paket, das Ergebnis der Ausführung von R CMD INSTALL auf einem Quellpaket. Auf einigen Plattformen (insbesondere OS X und Windows) gibt es auch binäre Pakete, eine Zip-Datei oder einen Tarball, der die Dateien eines installierten Pakets enthält, das entpackt werden kann, anstatt aus Quellen zu installieren. Ein Paket ist keine Bibliothek.

Also ja, ein Paket ist nicht die Funktionen darin; es ist ein Mechanismus, um R in der Lage zu sein, die Funktionen oder Daten zu verwenden, aus denen das Paket besteht. Daher muss es zuerst geladen werden.

+0

Sehr nützlich. Aber wie @Roland bemerkte, ist es kein Objekt - also ist es einfach ein Verzeichnis? – d8aninja

+1

@Canuckish, nein das Verzeichnis, in dem das Paket lebt, wird 'Bibliothek' genannt. Was verwirrend ist, da Pakete mit dem Funktionsaufruf 'library (foo)' geladen werden. Ich habe den Hyperlink in der obigen Antwort behoben, um auf die richtige Manpage zu zeigen. – Avraham

+0

Wirklich versucht, auf den "Typ" eines Pakets zu bekommen - es ist interessant für mich, dass, obwohl "alles in R ist ein Vektor", ich einen speziellen Aufruf (Listenstruktur?) Wie 'ls.str (" Paket: Paketname ") wie oben empfohlen. – d8aninja

19

Ihre Frage ist:

Welche Art von Objekt ein R-Paket?

Irgendwie fehlt mir noch eine Antwort auf genau diese Frage. Also hier geht:

Soweit R betroffen ist, ist ein R-Paket nicht ein Objekt. Das heißt, es ist kein Objekt in R-Typ-System. R ist ein bisschen schwierig zu sein, weil es Ihnen

library(pkg_name) 

, ohne dass Sie schreiben können vor pkg_name überall zu definieren. Im Gegensatz dazu müssen andere Objekte, die Sie in R verwenden, irgendwo definiert werden - entweder von Ihnen oder von einem Paket, das entweder explizit oder implizit geladen wird.

Das ist bedauerlich und verwirrt die Leute. Wenn Sie also library(pkg_name) sehen, denken

library('pkg_name') 

Das heißt, in Anführungszeichen den Paketnamen vorstellen. Dies funktioniert in der Tat wie erwartet. Die Tatsache, dass der Code auch funktioniert ohne Anführungszeichen ist eine Besonderheit der library Funktion, bekannt als non-standard evaluation. In diesem Fall ist es meistens eine unglückliche Designentscheidung (aber es gibt Gründe).

Also, um die Antwort zu wiederholen: Ein Paket ist keine Art von R-Objekt . Für R ist es einfach ein Name, der sich auf einen bekannten Ort im Dateisystem bezieht, ähnlich wie Sie es angenommen haben. BondedDust's Antwort geht ins Detail, um diese Struktur zu erklären, also werde ich es hier nicht wiederholen.


Für Super technische Einzelheiten finden Sie unter Josuas und Richards Kommentare.

+1

Tsk, tsk ... s/lib_name/pkg_name. :) Das Einzige, was ich hinzufügen könnte, ist, dass 'pkg_name' * * ein Objekt ist (ein ungebundenes Symbol im Pairlist, das die Funktionsargumente enthält) ... obwohl das vielleicht zu technisch ist. –

+0

Ich denke, das ist eine verdammt gute Antwort, und ich bin fest zwischen der Prüfung, oder @ BondedDust ist oben. Da er der erste war, den ich überprüfte, werde ich es zurückbringen. Aber ich mag diese Antwort wirklich. Vielen Dank. – d8aninja

+1

Nur eine Anmerkung, die 'TypeTable'-Struktur [gefunden in src/main/util.c] (http://svn.r-project.org/R/trunk/src/main/util.c) zeigt die gesamte Basis Arten. * Paket * gehört nicht dazu. Gedanke, der für jemanden nützlich sein könnte. :) –