2013-10-18 15 views
10

Ich entwickle ein Paket mit roxygen2, das eine Reihe von lattice basierte Visualisierungen enthält. Diese sind schön, aber nicht notwendig für die Verwendung des Pakets, und daher lattice ist im Suggests: Abschnitt der DESCRIPTION Datei statt der Depends: Abschnitt aufgelistet.Roxygen und vorgeschlagene Pakete

Allerdings habe ich noch nicht herausgefunden, wie von dem Benutzer in einer Art und Weise lattice auf Anfrage zu laden, die sowohl roxygenize() und R CMD check passieren. Die folgenden beiden Möglichkeiten machen beide lattice wie eine nicht angegebene Abhängigkeit und wird den Fehler unten zurückgegeben.

##' @import lattice 
{} 

##' Visualization 
##' 
##' @param x Data. 
##' @param y More data. 
##' @export 
vizz <- function(x, y){ 
    xyplot(y ~ x) 
} 

und

##' Visualization 
##' 
##' @param x Data. 
##' @param y More data. 
##' @export 
vizz <- function(x, y){ 
    library(lattice) 
    xyplot(y ~ x) 
} 

beide den gleichen Fehler

$ R CMD check dummy.roxygen 

* using log directory ‘/###/dummy.roxygen.Rcheck’ 
* using R version 3.0.2 (2013-09-25) 
* using platform: x86_64-pc-linux-gnu (64-bit) 
* using session charset: UTF-8 
* checking for file ‘dummy.roxygen/DESCRIPTION’ ... OK 
* checking extension type ... Package 
* this is package ‘dummy’ version ‘1.0-0’ 
* package encoding: UTF-8 
* checking package namespace information ... OK 
* checking package dependencies ... ERROR 
Namespace dependencies not required: ‘lattice’ 

See the information on DESCRIPTION files in the chapter ‘Creating R 
packages’ of the ‘Writing R Extensions’ manual. 

Da sucht auf dem Begriff "roxygen" in Kombination mit "schlägt", "hängt" und "Importe" Rückkehr gibt eine Flut von irrelevanten Treffern, ich habe seit einiger Zeit erfolglos nach einer Antwort gesucht. In der Zwischenzeit habe ich nur lattice und eine Reihe von anderen netten, aber nicht-lebenswichtigen Paketen als Abhängigkeiten aufgelistet, aber jetzt, wenn ich das Paket veröffentlichen möchte, möchte ich es auf die richtige Weise lösen.

+0

Haben Sie versucht, das Hinzufügen '#‘ @importFrom Gitter xyplot' in Ihrer Funktion roxygen Abschnitt? – juba

+0

habe ich jetzt, aber es gibt mir den gleichen Fehler. – Backlin

+0

Aber hat roxygen das Gitter zu Ihrer 'Import' Sektion in' DESCRIPTION' hinzugefügt? – juba

Antwort

9

Die Empfehlung (im Jahr 2013, als ich zuerst diese Antwort schrieb) zu require in einer bedingten Anweisung zu sein. Jetzt im Jahr 2016 the official recommendation ist :: zu verwenden und lassen Sie R die there is no package called X Fehler drucken:

##' Visualization 
##' 
##' @description Visualize the data. \pkg{\link{lattice}} package required. 
##' @param x Data. 
##' @param y More data. 
##' @seealso \pkg{\link{lattice}} 
##' @export 
vizz <- function(x, y){ 
    lattice::xyplot(y ~ x) 
} 

Und nur halten Suggests: lattice in Ihrem DESCRIPTION (kein import im NAMESPACE).

Wenn Sie die Fehlermeldung anpassen möchten Sie jetzt requireNamespace(lattice) in einer bedingten Anweisung, wie verwenden:

vizz <- function(x, y){ 
    if (! requireNamespace("lattice", quietly = TRUE)) { 
     stop("Please install lattice: install.packages('lattice')") 
    lattice::xyplot(y ~ x) 
} 
+1

Abgesehen davon, dass es der herkömmliche Weg ist, wissen Sie, ob es einen bestimmten Grund gibt, 'if (require (pkg)) stop (msg)' anstelle von 'library (pkg)' zu verwenden, was automatisch den Fehler auslöst manuell angegeben? – Backlin

+0

Ich glaube nicht, dass es einen Grund gibt, da beide Funktionen genau das Gleiche tun. – Calimo

+0

Dann bleibe ich wohl bei meiner eigenen Antwort, da ich und @while schon eine Diskussion darüber hatten. Aber danke, dass du es der Vollständigkeit halber hinzugefügt hast! – Backlin

0

Ich bin mir nicht sicher, was meine Probleme verursacht hat, aber nach einigem Debugging mit Hilfe von @juba stellt sich heraus, dass ich bereits die richtige Lösung in der Frage vorgeschlagen habe. Der richtige Weg, um mit netten, aber nicht-lebenswichtigen Paketen fertig zu werden, besteht darin, sie im Suggests:-Abschnitt der DESCRIPTION-Datei aufzulisten und sie auf folgende Weise mit roxygen zu markieren.

##' Visualization 
##' 
##' See \code{\link[lattice]{xyplot}} for details. 
##' 
##' @param x Data. 
##' @param y More data. 
##' @export 
vizz <- function(x, y){ 
    library(lattice) 
    xyplot(y ~ x) 
} 

Dies wird nicht automatisch installiert noch lattice befestigen bei der Installation/Befestigung meines Pakets, sondern einfach einen Fehler aus, wenn lattice nicht angebracht werden kann, wenn die Funktion ausgeführt wird.

+0

Gemäß der Dokumentation sollten Sie 'require' anstelle von' library' innerhalb von Funktionen verwenden, da es warnt, anstatt einen Fehler zu melden, wenn das Paket fehlt. – while

+0

Ich habe das auch gesehen. In meinem Fall möchte ich * jedoch einen Fehler ausgeben, wenn das Paket fehlt. Wenn nicht, würde ein Fehler, die "xyplot" -Funktion nicht zu finden, trotzdem in die nächste Zeile geworfen werden, was für den Endbenutzer wahrscheinlich mehrdeutig ist. – Backlin

+0

Ok, tut mir leid. In diesem Fall sollten Sie wahrscheinlich 'library' verwenden. Wollte nur teilen, falls Sie es verpasst haben, da die Bibliothek automatisch geladen werden sollte, wenn Sie require ebenfalls benötigen. Sie können das Ergebnis auch flexibler handhaben, wenn Sie 'require' verwenden, da es einen booleschen Wert zurückgibt. – while