distribuendo pacchetto R contenente unit test
-
18-09-2019 - |
Domanda
così ho deciso di mettere le mie poche funzioni R in un pacchetto e che sto leggendo / apprendimento Writing R estensione .
si lamenta, ovviamente, su una quantità di cose che non sto facendo.
Dopo abbastanza googling, che sto sparando a qualche domanda qui, questa è una questione di stile di prova: io sto usando runIt e mi piace aventi test il più vicino possibile al codice in fase di test. in questo modo io non dimenticare le prove e ho usare i test come parte della documentazione tecnica.
Ad esempio:
fillInTheBlanks <- function(S) {
## NA in S are replaced with observed values
## accepts a vector possibly holding NA values and returns a vector
## where all observed values are carried forward and the first is
## carried backward. cfr na.locf from zoo library.
L <- !is.na(S)
c(S[L][1], S[L])[1 + cumsum(L)]
}
test.fillInTheBlanks <- function() {
checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4))
checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4))
checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4))
}
ma R CMD check
problemi NOTA linee, come questo:
test.fillInTheBlanks: no visible global function definition for
‘checkEquals’
e si lamenta di me non documentare le funzioni di test.
Non voglio davvero aggiungere documentazione per le funzioni di test e io sicuramente preferirei non dover aggiungere una dipendenza al pacchetto runit.
Come pensi che dovrei guardare a questo problema?
Soluzione
Dove stai mettendo il test di unità? Non si può decidere di metterli nella directory R
. Un approccio più standard è di metterli sotto inst\unitTests
. Dai un'occhiata alla questa pagina R-wiki per quanto riguarda la configurazione.
In alternativa, è possibile specificare quali verranno esportati i file nello spazio dei nomi, e per estensione, quali funzioni dovrebbero e non dovrebbero essere documentate.
Oltre a ciò, idealmente si dovrebbe avere i test eseguito quando R CMD CONTROLLO si chiama; che è parte del disegno. In questo caso, è necessario creare uno script di test di chiamare i tuoi test in una directory tests
separata. E si dovrà caricare il pacchetto runit in quello script (ma non è necessario per renderlo una dipendenza del pacchetto).
Modifica 1:
Per quanto riguarda il tuo fallimento, perché non riesce a trovare la funzione checkEquals: vorrei cambiare si funzione di essere in questo modo:
test.fillInTheBlanks <- function() {
require(RUnit)
checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4))
checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4))
checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4))
}
In questo modo il pacchetto viene caricato quando la funzione viene chiamata o sarà informare l'utente che è necessario il pacchetto.
Modifica 2:
Si noti che tutti gli oggetti a livello di utente in un pacchetto devono essere documentate; se un pacchetto pkg contiene oggetti a livello di utente che sono per l'uso “interno” solo, dovrebbe fornire un file pkg-internal.Rd che documenta tutti questi oggetti, e chiaramente afferma che questi non sono destinate ad essere chiamati dall'utente. Vedi per esempio le fonti per griglia pacchetto nella distribuzione R per un esempio. Si noti che i pacchetti che utilizzano oggetti interni ampiamente dovrebbero nascondere gli oggetti in uno spazio dei nomi, quando non hanno bisogno di essere documentata (vedi spazi Nome del pacchetto).
È possibile utilizzare il file pkg-internal.Rd come una possibilità, ma se si ha intenzione di avere molti oggetti nascosti, questo è di solito trattati nelle dichiarazioni dello spazio dei nomi.
Altri suggerimenti
Hai caricare il pacchetto RUnit
?
La cosa migliore è probabilmente quello di guardare un pacchetto che contiene il codice esistente utilizzando RUnit
.