2016-03-16 18 views
5

Sono nuovo nello sviluppo del pacchetto R e nello stack overflow, ma non sono riuscito a trovare queste informazioni da nessuna parte.Caricamento pacchetto in ambiente selezionato

Sto provando a caricare i mouse del pacchetto R, senza che esso inquini il mio spazio dei nomi. Ho provato a importare solo le funzioni che sto usando, ma non ha funzionato. Così mi accontento di caricare l'intero pacchetto in un unico ambiente specifico come segue:

e <- new.env() 
load_package_into_environment(e, package = "mice") 
eval(mice(data, m = m, maxit = max.iter, printFlag = F), envir = e) 

Tuttavia, non sono stato in grado di trovare la reale funzione di sostituire il "load_package_into_environment" segnaposto. Quale funzione, se del caso, lo farebbe?

MODIFICA: Ecco i file con cui sto lavorando e il problema che devo fornire maggiori dettagli.

File: DESCRIZIONE

Package: bug.example2 
Title: Example of Package Loading Bug 
Version: 0.0.0.9000 
[email protected]: person("R", "Woodbridge", email = "[email protected]", role = c("aut", "cre")) 
Description: Creates a wrapper function for mice::mice function. 
Depends: 
    R (>= 3.2.3), 
    data.table (>= 1.9.6) 
License: 
LazyData: true 
Imports: mice 
RoxygenNote: 5.0.1 

File: namspace (generato automaticamente da roxygen)

import(data.table) 
importFrom(mice,mice) 
importFrom(mice,mice.impute.logreg) 
importFrom(mice,mice.impute.pmm) 
importFrom(mice,mice.impute.polr) 
importFrom(mice,mice.impute.polyreg) 

File: impute.R (utilizza la funzione topi dal pacchetto topi)

#' @import data.table 
#' @importFrom mice mice 
#' @importFrom mice mice.impute.pmm 
#' @importFrom mice mice.impute.logreg 
#' @importFrom mice mice.impute.polyreg 
#' @importFrom mice mice.impute.polr 
#' @export 
impute <- function(data, m = 5, max.iter = 5){ 

mice_environment <- new.env() 


#Impute missing data using mice function, output format is mids object 
mice.out <- mice(data, m = m, maxit = max.iter, printFlag = F) 

#save the m imputed data.frames as a list of data.tables 
return.list <- lapply(1:m, function(x){ 
            as.data.table(complete(mice.out, x)) 
             }) 
names(return.list) <- paste0("imp.",1:m) 
return.list 
} 

File: test-impute.R (usa testthat pacchetto per testare la funzione impute) Uscita

context("Impute missing values") 
test_that("Output format is a list of lenght m and each element is a data.table",{ 
#Set up data 
set.seed(200) 
data <- iris 
data$Species[runif(nrow(data)) < .1] <- NA 
data$Sepal.Width[runif(nrow(data)) < .2] <- NA 
setDT(data) 

#Create imputed data 
M <- 5 
impute.output <- impute(data, m = M) 

#Test output format 
expect_is(impute.output, "list") 
expect_equal(length(impute.output), M) 
lapply(impute.output,expect_is, "data.table") 
}) 

errore da testthat

1. Error: Output format is a list of lenght m and each element is a data.table - 
The following functions were not found: mice.impute.pmm, mice.impute.polyreg 
1: withCallingHandlers(eval(code, new_test_environment), error = capture_calls, message = function(c) invokeRestart("muffleMessage")) 
2: eval(code, new_test_environment) 
3: eval(expr, envir, enclos) 
4: impute(data, m = M) at test-impute.R:12 
5: mice(data, m = m, maxit = max.iter, printFlag = F) at   C:\repos\bug.example2/R/impute.R:11 
6: check.method(setup, data) 
7: stop(paste("The following functions were not found:", paste(fullNames[notFound], 
    collapse = ", "))) 
+0

Un pacchetto * è * caricato in un ambiente dedicato. Cosa intendi con "inquinanti"? – nicola

+0

'importFrom' è stato il mio primo approccio, ma ho importato una funzione che chiamo tutte e tutte le sue funzioni dipendenti, ma ricevo comunque un messaggio che alcune di queste funzioni dipendenti non vengono trovate quando provo a creare il pacchetto. Penso che sia il risultato di come vengono costruiti i topi. –

+0

Si prega di consultare http://stackoverflow.com/a/40830959/4468078 e leggere il pacchetto 'import' che (quasi) fa esattamente ciò che si desidera. L'unica cosa che non ho ancora provato è se puoi creare il tuo ambiente invece di specificare il nome del nuovo ambiente. Un'altra differenza potrebbe essere che 'import' allega l'ambiente nel percorso di ricerca che è possibile non quello che vuoi (e puoi correggerlo scollegandolo). –

risposta

0

ho ottenuto lo stesso errore di ieri e di aprire un domanda simile (che è già stata downvoted btw). Oggi ho trovato una soluzione, spero che funzioni anche per te e forse tu (o altri) puoi illuminare un po 'più di luce.

Sto sviluppando un pacchetto R e utilizzo di roxygen2 per documentare le funzioni. Ho elencato i mouse nella sezione delle mie importazioni nel file di descrizione poiché devo usare la funzione mouse :: mouse. Quando si costruisce e si controlla il pacchetto, tutto procede liscio finché non eseguo effettivamente la funzione che chiama mice :: mice, a quel punto ottengo lo stesso errore che si ottiene.

Per quanto riguarda la mia comprensione va questo è ciò che causa il problema: Nella parte di documentazione della funzione che utilizza i topi, è necessario aggiungere questo bit:

#' @importMethodsFrom mice 
#' @importFrom mice mice 

Si noti che con la maggior parte dei pacchetti I già utilizzato finora, la seguente riga sarebbe stata più che sufficiente:

#' @importFrom mice mice 

Apparentemente topi richiede di aggiungere la direttiva @importMethodsFrom troppo. La mia ipotesi è che questo è dovuto al fatto che sta usando le classi S4, ma ne conosco poco, quindi so solo che funziona così.

ho scoperto questo leggendo la sezione "S4" in questa pagina: http://r-pkgs.had.co.nz/namespace.html#imports

Quindi, per tornare al vostro caso specifico, la mia ipotesi è che la documentazione per la vostra funzione dovrebbe essere simile a questo

#' @import data.table 
#' @importFrom mice mice 
#' @importMethodsFrom mice 
#' @export 
impute <- function(data, m = 5, max.iter = 5){...} 

Questo ha funzionato bene per me. Spero che aiuti anche per te.

1

Il pacchetto "mouse" internamente sta chiamando metodi di imputazione dall'ambiente globale. Secondo gli autori questo è per consentire di fornire i propri metodi personalizzati per le imputazioni. Pertanto, il pacchetto deve esporre le loro implementazioni predefinite anche nell'ambiente globale. Riconosco che questo è un bell'esempio di puro giudizio: i metodi interni sono ora riconosciuti dal pacchetto solo attraverso l'ambiente globale. In primo luogo, ciò sta vanificando lo scopo del codice di imballaggio. Se si desidera consentire l'uso di funzioni esterne dal pacchetto, è sufficiente fornire un'API per passarle al pacchetto.

Il messaggio di errore che si vede è innescato da funzione 'topi ::: check_method':

notFound <- !vapply(fullNames, exists, logical(1), mode = "function", inherits = TRUE) 

La mia soluzione è quella di ri-esportazione metodi utilizzati internamente da 'topi' dalla mia pacchetto (che usa internamente 'topi', proprio come il tuo). In poche parole in uno dei file di ricerca e di eseguire su di esso roxygen2:

#' @importFrom mice mice 

#' @export 
mice.impute.pmm <- mice::mice.impute.pmm 

#' @export 
mice.impute.polyreg <- mice::mice.impute.polyreg 

Naturalmente avrete bisogno di esportare altri metodi se vengono utilizzati sui dati.

Il mio punto di vista è che se ho bisogno di inquinare l'ambiente globale, lo inquinerò minimamente, solo con le funzioni necessarie per far funzionare i "mouse".

Problemi correlati