2013-10-18 21 views
10

Pracuję nad pakietem z roxygen2, który zawiera wiele wizualizacji opartych na lattice. Są ładne, ale nie są konieczne do korzystania z pakietu, dlatego numer lattice jest wymieniony w sekcji Suggests: pliku DESCRIPTION, a nie w sekcji Depends:.Roxygen i sugerowane pakiety

Jednak, nie wiem jeszcze, jak załadować lattice na żądanie użytkownika w sposób, który przekazuje zarówno roxygenize() i R CMD check. Dwa poniższe sposoby sprawiają, że lattice wygląda na zależność niesklasyfikowaną i zwróci błąd poniżej.

##' @import lattice 
{} 

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

i

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

zarówno daje ten sam błąd

$ 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. 

ponieważ wyszukiwań terminu "roxygen" w połączeniu z "sugeruje", "zależy" i "import" zwróci powódź nieistotnych hitów, od jakiegoś czasu bezskutecznie szukałem odpowiedzi na to pytanie. W międzyczasie właśnie wymieniłem lattice i kilka innych ładnych, ale nie istotnych pakietów, ale teraz, gdy mam zamiar opublikować pakiet, chciałbym rozwiązać go we właściwy sposób.

+0

Próbowałaś dodanie '#” @importFrom kratownica xyplot' w sekcji roxygen funkcji? – juba

+0

Zrobiłem to teraz, ale daje mi ten sam błąd. – Backlin

+0

Ale czy roxygen dodać kratę do sekcji 'Imports' w' OPIS'? – juba

Odpowiedz

9

Rekomendacja użyta (w 2013 r., Kiedy po raz pierwszy napisałem tę odpowiedź), aby być require w instrukcji warunkowej. Teraz w 2016 the official recommendation jest użycie :: i niech R wydrukować błąd there is no package called X:

##' 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) 
} 

I tylko trzymać Suggests: lattice w swojej DESCRIPTION (bez import w NAMESPACE).

Jeśli chcesz dostosować komunikat o błędzie można teraz używać requireNamespace(lattice) w instrukcji warunkowej, takich jak:

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

Czy jest inny niż konwencjonalny sposób, czy wiesz, że istnieje jakiś szczególny powód używania 'if (require (pkg)) stop (msg)' zamiast 'library (pkg)' który automatycznie wyrzuci błąd określone ręcznie? – Backlin

+0

Myślę, że nie ma powodu, ponieważ obie funkcje najwyraźniej robią dokładnie to samo. – Calimo

+0

W takim razie pewnie pozostanę z własną odpowiedzią, ponieważ ja i @ już rozmawialiśmy na ten temat. Ale dzięki za dodanie do kompletności! – Backlin

0

Nie jestem pewien, co spowodowało moje problemy, ale po pewnym debugowaniu z pomocą @juby okazało się, że już zasugerowałem prawidłowe rozwiązanie w pytaniu. Właściwym sposobem radzenia sobie z ładnymi, ale nieistotnymi pakietami jest umieszczenie ich w sekcji Suggests: pliku DESCRIPTION i oznaczenie ich w następujący sposób przy użyciu roxygen.

##' 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) 
} 

To nie będzie automatycznie instalować ani dołączyć lattice po zainstalowaniu/mocowania moją paczkę, ale po prostu wyrzucić błąd, jeśli lattice nie mogą być dołączone, gdy funkcja jest wykonywana.

+0

Zgodnie z dokumentacją powinieneś użyć 'require' zamiast' library' w obrębie funkcji, ponieważ będzie ostrzegał zamiast rzucać błąd, jeśli pakiet nie istnieje. – while

+0

Też to widziałem. Jednak w moim przypadku * chcę *, aby zgłosić błąd, jeśli pakiet nie istnieje. Jeśli tak nie jest, błąd o nieodnalezieniu funkcji 'xyplot' zostanie zgłoszony w następnym wierszu, co jest prawdopodobnie bardziej niejednoznaczne dla użytkownika końcowego. – Backlin

+0

Ok, przepraszam. W takim przypadku prawdopodobnie powinieneś użyć 'library'. Po prostu chciałem się dzielić na wypadek, gdybyś go przegapił, ponieważ biblioteka powinna być ładowana automatycznie, jeśli użyjesz również wymagać. Możesz również obsłużyć wynik bardziej elastycznym, jeśli użyjesz 'require', ponieważ zwróci on wartość logiczną. – while