2015-09-11 11 views
6

C'è un codice di accesso in un pacchetto R in grado di trovare quale pacchetto o spazio dei nomi a cui appartiene?Codice nel pacchetto R: scopri * quale * pacchetto/spazio dei nomi è in


Contesto: trovo di avere un codice comune tra i pacchetti che differisce solo nel nome del pacchetto. Un comune esempio è tests/testthat.R:

library(testthat) 
library(ShiftedExcitation) 

test_check("ShiftedExcitation") 

Se il codice potrebbe scoprire a quale pacchetto o spazio appartiene, ho potuto evitare un certo numero di luoghi in cui il nome del pacchetto è ormai dato.


In questo momento mi definiscono una variabile nascosta che contiene il nome del pacchetto, dicono

.PKG <- "ShiftedExcitation"

e quindi utilizzare qualcosa sulla falsariga di *

library(testthat) 
library(.PKG, character.only = TRUE) 

test_check(.PKG) 

ma io Sono curioso di sapere se esiste una soluzione più elegante.

* Non ho ottenuto questo funzionamento finora come testthat.R viene valutato al di fuori del namespace del pacchetto. Tuttavia, funziona per definire una funzione unittest all'interno del codice del pacchetto.

+0

Potrebbe essere possibile utilizzare '.getNameSpace (match.call() [[1]])' che accetta il nome della funzione come argomento. probabilmente utile: http://stackoverflow.com/questions/15595478/how-to-get-the-name-of-the-calling-function-inside-the-called-routine –

+0

'getNamespaceName (topenv())'? Ad esempio, 'debug (lm); lm(); getNamespaceName (topenv()) ' –

+0

@MartinMorgan:' topenv' è quasi la risposta - solo che lo spazio dei nomi 'testthat' può trovarsi prima del pacakge nel percorso' search() '. – cbeleites

risposta

0

Si avvicina una risposta:

@ suggerimento di MartinMorgan utilizzare topenv() è abbastanza vicino. Ma risulta che durante l'esecuzione dei test unitari con testthat, è prima dello lo spazio dei nomi del pacchetto nel percorso di ricerca.

Quindi questo è lo stato attuale:

.findmyname <- function() { 
    pkgs <- .packages() 

    if (pkgs [1] == "testthat") 
     pkgs [2] 
    else 
     pkgs [1] 
} 

Questa funzione trova il nome del pacchetto in questione sia dall'interno del pacchetto e in tests/testthat.R. (Naturalmente, qualsiasi .findmyname() definito all'interno del pacchetto non è noto in tests/testthat.R prima della chiamata library ...)

+1

Sembra che la prima attraverso la terza riga possa essere probabilmente sostituita con 'pkgs <- .packages()' –

+0

@RichardScriven: grazie, aggiornato. – cbeleites

Problemi correlati