Ich habe ein Dienstprogramm-R-Skript, util.R, erstellt, das ich aus anderen Skripten in meinem Projekt verwenden möchte. Wie kann sichergestellt werden, dass die in diesem Skript definierte Funktion für meine anderen Skripte verfügbar ist?
Ich suche etwas Ähnliches wie die require
Funktion, die ein Paket nur lädt, wenn es noch nicht geladen wurde. Ich möchte nicht aufrufen, source("util.R")
da dadurch das Skript bei jedem Aufruf geladen wird.
Ich weiß, dass ich einige Antworten erhalten werde, die mich auffordern, ein Paket zu erstellen, wie in Organisieren von R-Quellcode :) Aber ich erstelle nichts, das an anderer Stelle verwendet wird, es ist nur ein eigenständiges Projekt.
Antworten:
Hier ist ein möglicher Weg. Verwenden Sie die
exists
Funktion, um nach etwas Einzigartigem in Ihremutil.R
Code zu suchen.Beispielsweise:
(Bearbeitet, um aufzunehmen
mode="function"
, wie Gavin Simpson betonte)quelle
exists()
- mussmode = "function"
hinzugefügt werden, um es narrensicher zu machenexists()
scheint einen Fehler auszulösen, außer dass in R 3.0.2 ein Fehler zurückgegeben wird.Es ist so etwas nicht eingebaut, da R keine Anrufe an verfolgt
source
und nicht herausfinden kann, was von wo geladen wurde (dies ist bei Verwendung von Paketen nicht der Fall). Sie können jedoch dieselbe Idee wie in C-.h
Dateien verwenden, dh das Ganze einpacken in:quelle
source("util.R")
innerhalb desif
Codes anrufen , oder?Say
util.R
erzeugt eine Funktionfoo()
. Sie können überprüfen, ob diese Funktion in der globalen Umgebung verfügbar ist, und das Skript als Quelle verwenden, wenn dies nicht der Fall ist:Das wird alles mit dem Namen finden
foo
. Wenn Sie eine Funktion finden möchten, ist dies (wie von @Andrie erwähnt)exists()
hilfreich, es muss jedoch genau angegeben werden, nach welcher Art von Objekt gesucht werden soll, zHier ist
exists()
in Aktion:quelle
grepl(..., value=TRUE)
da Ihr Suchbegriff wahrscheinlich kein regulärer Ausdruck ist. +1 übrigens.grepl()
hat kein Argumentvalue
, aber ich sollte wahrscheinlich den regulären Ausdruck inls()
...fixed=TRUE
exists()
ist besser, aber ich sehe jetzt, dass Sie in der Zwischenzeit eine solche Antwort gepostet haben.Sie können eine Funktion schreiben, die einen Dateinamen und einen Umgebungsnamen verwendet, prüft, ob die Datei in die Umgebung geladen wurde, und verwendet,
sys.source
um die Datei als Quelle zu verwenden , wenn nicht.Hier ist eine schnelle und ungetestete Funktion (Verbesserungen willkommen!):
quelle
Hier ist eine Funktion, die ich geschrieben habe. Es umschließt die
base::source
Funktion zum Speichern einer Liste von Quelldateien in einer globalen Umgebungsliste mit dem Namensourced
. Eine Datei wird nur dann erneut als Quelle bereitgestellt, wenn Sie ein.force=TRUE
Argument für den Aufruf der Quelle angeben. Die Signatur des Arguments ist ansonsten identisch mit der tatsächlichen Signatur,source()
sodass Sie Ihre Skripte nicht neu schreiben müssen, um dies zu verwenden.Es ist ziemlich gesprächig (viele Anrufe bei
message()
), so dass Sie diese Zeilen herausnehmen können, wenn Sie sich interessieren. Jeder Rat von erfahrenen R-Benutzern wird geschätzt; Ich bin ziemlich neu bei R.quelle
Ich habe mein Problem mit der gesamten Adresse gelöst, an der mein Code lautet: Vorher:
Nach dem:
quelle