2016-03-16 11 views
5

Ich bin neu in R-Paket-Entwicklung und Stack-Überlauf, aber ich konnte diese Informationen nirgendwo finden.Load r-Paket in ausgewählten Umgebung

Ich versuche, die R-Paket-Mäuse zu laden, ohne dass es meinen Namensraum verschmutzt. Ich habe versucht, nur die Funktionen zu importieren, die ich verwende, aber das hat nicht funktioniert. Also werde ich regeln für das gesamte Paket in einer bestimmten Umgebung laden Sie wie folgt vor:

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

Allerdings habe ich nicht in der Lage, die eigentliche Funktion zu finden, die „load_package_into_environment“ Platzhalter zu ersetzen. Welche Funktion würde dies gegebenenfalls erfüllen?

EDIT: Hier sind die Dateien, mit denen ich arbeite und das Problem muss ich mehr Details geben.

File: BESCHREIBUNG

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 (automatisch von roxygen erzeugt)

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 (verwendet die Maus-Funktion aus dem Mäuse-Paket)

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

Datei: Test-impute.R (verwendet testthat Paket impute Funktion zu testen) aus

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") 
}) 

Fehlerausgang 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

Ein Paket * wird * in eine dedizierte Umgebung geladen. Was meinst du mit "Verschmutzung"? – nicola

+0

'ImportFrom' war mein erster Ansatz, aber ich habe die eine Funktion importiert ich alle und alle abhängigen Funktionen davon aufrufen, aber ich bekomme immer noch eine Nachricht, dass einige dieser abhängigen Funktionen nicht gefunden werden, wenn ich versuche, das Paket zu bauen. Ich denke, es ist ein Ergebnis davon, wie Mäuse gebaut werden. –

+0

Bitte lesen Sie http://stackoverflow.com/a/40830959/4468078 und lesen Sie über das 'import' Paket, das (fast) genau das tut, was Sie wollen. Das einzige, was ich noch nicht ausprobiert habe, ist, ob Sie Ihre eigene Umgebung erstellen können, anstatt den Namen der neuen Umgebung anzugeben. Ein weiterer Unterschied könnte sein, dass 'import' die Umgebung in den Suchpfad einfügt, was nicht möglich ist, was Sie wollen (und Sie können es beheben, indem Sie es entfernen). –

Antwort

0

habe ich den gleichen Fehler gestern und öffnen ein ähnliche Frage (die wurde bereits twenty downvoted). Heute habe ich eine Lösung gefunden, ich hoffe, dass es auch für dich funktioniert und vielleicht kannst du (oder andere) etwas mehr Licht darauf werfen.

Ich entwickle ein R-Paket und verwende roxygen2, um die Funktionen zu dokumentieren. Ich habe Mäuse in meiner Import-Sektion in der Beschreibungsdatei aufgelistet, da ich die mice :: mice-Funktion verwenden muss. Wenn ich das Paket baue und überprüfe, läuft alles glatt, bis ich tatsächlich die Funktion rufe, die maus :: mäuse aufruft, an diesem Punkt bekomme ich den gleichen Fehler, den du bekommst.

Soweit mein Verständnis geht es das, was das Problem verursacht: In der Dokumentation Teil der Funktion, die Mäuse verwenden, können Sie diesen Bit hinzufügen müssen:

#' @importMethodsFrom mice 
#' @importFrom mice mice 

Beachten Sie, dass bei den meisten Paketen I habe bisher verwendeten, würde die folgende Zeile mehr als genug gewesen:

#' @importFrom mice mice 

Anscheinend Mäuse erfordert, dass Sie die @importMethodsFrom Richtlinie hinzuzufügen. Meine Vermutung ist, dass dies daran liegt, dass es S4-Klassen verwendet, aber ich weiß wenig über sie, also weiß ich einfach, dass es so funktioniert.

Ich fand heraus, das auf dieser Seite den „S4“ Abschnitts durch das Lese: http://r-pkgs.had.co.nz/namespace.html#imports

Also, um an Ihrem speziellen Fall zurück ist, ist meine Vermutung, dass die Dokumentation für Ihre Funktion so etwas wie diese

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

Das funktionierte gut für mich. Hoffe es hilft auch für dich.

1

Paket 'Mäuse' ruft intern Imputationsmethoden aus der globalen Umgebung auf. Nach Ansicht der Autoren soll dies die Bereitstellung eigener, benutzerdefinierter Methoden für Imputationen ermöglichen. Daher muss das Paket seine Standardimplementierungen auch in der globalen Umgebung verfügbar machen. Ich erkläre, dass dies ein schönes Beispiel für reines Urteilsvermögen ist - interne Methoden werden jetzt durch das Paket nur durch die globale Umwelt erkannt. Damit wird der Zweck des Verpackungscodes zunichte gemacht. Wenn Sie zulassen möchten, dass externe Funktionen von Ihrem Paket verwendet werden, geben Sie einfach eine API für die Übergabe an das Paket an.

Die Fehlermeldung, die Sie sehen, wird durch die Funktion ausgelöst ‚Mäuse ::: check_method‘:

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

Meine Abhilfe ist erneut Exportmethoden intern von ‚Mäuse‘ aus meiner eigenen Paket verwendet (die intern verwendet "Mäuse", genau wie deine).

#' @importFrom mice mice 

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

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

Natürlich können Sie andere Methoden exportieren benötigen, wenn sie auf Ihre Daten verwendet werden: in einem Ihrer R-Dateien und führen roxygen2 auf es einfach auszudrücken.

Mein Standpunkt ist, dass, wenn ich die globale Umwelt verschmutzen muss, ich es minimal verschmutzen werde, nur mit Funktionen, die für "Mäuse" erforderlich sind, um zu arbeiten.