2016-04-21 9 views
0

on-the-fly zu erhalten. Ich schreibe ein R-Paket, das eine Vielzahl von Bioconductor Annotation-Datenpaketen verwendet. Die spezifischen Datenpakete variieren mit dem Anwendungsfall. Als solche habe ich eine Funktion, die so etwas wie dies funktioniert:Verwenden Sie 'require' Paketcode, um Datenpakete in R

if (!require(biocpack_name, character.only=T)) { 
    source("https://bioconductor.org/biocLite.R") 
    BiocInstaller::biocLite(biocpack_name) 
    require(biocpack_name , character.only=T) 
} 

biocpack_name kann von ~ 30 + Kommentardatenpakete mehrere sein, die auf die speziellen Daten, die analysiert wurden, nachgeschlagen werden. Daher möchte ich nicht jedes zu "Suggests" hinzufügen müssen (ich bin mir nicht einmal sicher, dass das funktionieren würde, weil der Fehler nicht für ein Paket ist, sondern eine Zeichenfolge, die das Paket angibt). R CMD CHK gibt mir diesen Fehler:

'library' or 'require' call not declared from: ‘biocpack_name’ 
'library' or 'require' call to ‘biocpack_name’ in package code. 

Wie komme ich um diese?

Antwort

1

Es ist kein Fehler, sondern eine Warnung. Es geht weg, wenn Sie character.only = TRUE statt T verwenden (ich denke, weil der Wert von TRUE bekannt ist und nicht neu zugewiesen werden kann, aber T ist unbekannt und kann alles sein, einschließlich FALSE). Aber folgen Sie zusätzlich dem Hinweis in der Warnung, requireNamespace() zu verwenden (und den Benutzersuchpfad nicht zu verschmutzen); vielleicht db = get(biocpack_name, getNamespace(biocpack_name)) können Sie das Annotation-Paket verwenden, wie Sie möchten, z. B. mapIds(db, ...). Wenn man pedantisch wäre, würde das Hinzufügen der Pakete zum Feld "Enhancements:" der Datei DESCRIPTION mitteilen, dass das Paket irgendwie mit den Annotationspaketen arbeitet, aber nicht zur Installation des Pakets führt (zB zum Erstellen der Vignette). sofern nicht ausdrücklich verlangt.

+0

Ändern von T auf TRUE behobenes Problem. Ein nicht sicherer Ansatz würde funktionieren, da das Paket innerhalb einer Funktion geladen, dann aber von einer anderen Funktion verwendet wird. Würde "db" nicht lokal für die Funktion sein, in der es erstellt wurde? – alexvpickering

+1

Ja, Sie müssten sich Gedanken darüber machen, wie Ihre Funktionen gestaltet wurden. vielleicht wird der obige Code 'get_db()' genannt und gibt das db-Symbol jedes Mal zurück, wenn es gebraucht wird? –

+0

Ich habe versucht, wie vorgeschlagen, aber stieß auf einen Fehler. Zum Beispiel, wenn 'biopack_name <-" hgu95av2.db "' und das zurückgegebene Objekt 'db' heißt. Folgendes funktioniert gut, um einige Beispielschlüssel zu erhalten: 'keys <- AnnotationDbi :: keys (db) [1: 5]'. Sowohl 'AnnotationDbi :: mapIds (db, Schlüssel," SYMBOL ", Schlüsseltyp =" PROBEID ")' und 'AnnotationDbi :: select (db, Schlüssel," SYMBOL ")' scheitern mit 'Objekt 'hgu95av2ORGPKG' nicht gefunden ' – alexvpickering

Verwandte Themen