Загрузить пакет r в выбранной среде

Я новичок в разработке пакетов R и переполнении стека, но нигде не смог найти эту информацию.

Я пытаюсь загрузить мыши пакета R, не загрязняя при этом мое пространство имен. Я пытался импортировать только те функции, которые использую, но это не сработало. Поэтому я соглашусь на загрузку всего пакета в одной конкретной среде следующим образом:

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

Однако мне не удалось найти фактическую функцию для замены заполнителя «load_package_into_environment». Какая функция, если таковая имеется, могла бы выполнить это?

EDIT: Вот файлы, с которыми я работаю, и проблема, которую я должен описать более подробно.

Файл: ОПИСАНИЕ

Package: bug.example2
Title: Example of Package Loading Bug
Version: 0.0.0.9000
Authors@R: 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

Файл: NAMSPACE (автоматически создан 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)

Файл: impute.R (использует функцию mouses из пакета mouses)

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

Файл: test-impute.R (использует пакет testthat для проверки функции вменения)

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

Вывод ошибки из 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 = ", ")))

person r.woodbridge    schedule 16.03.2016    source источник
comment
Пакет загружается в специальную среду. Что вы имеете в виду под загрязнением?   -  person nicola    schedule 17.03.2016
comment
importFrom был моим первым подходом, но я импортировал одну функцию, которую я вызываю для всех и всех ее зависимых функций, но я все еще получаю сообщение о том, что некоторые из этих зависимых функций не найдены, когда я пытаюсь собрать пакет. Я думаю, это результат того, как устроены мыши.   -  person r.woodbridge    schedule 17.03.2016
comment
См. stackoverflow.com/a/40830959/4468078 и прочитайте о пакете import, который (почти) точно делает то, что вы хотите . Единственное, что я еще не пробовал, это можно ли создать свою среду вместо указания имени новой среды. Еще одно отличие может заключаться в том, что import прикрепляет среду к пути поиска, что возможно не то, что вы хотите (и вы можете исправить, отсоединив ее).   -  person R Yoda    schedule 27.11.2016


Ответы (2)


Пакет «мыши» внутри вызывает методы вменения из глобальной среды. По мнению авторов, это позволяет использовать собственные, настраиваемые методы вменения. Таким образом, пакет также должен предоставлять свои реализации по умолчанию в глобальной среде. Я считаю, что это хороший пример чистого суждения — внутренние методы теперь распознаются пакетом только через глобальную среду. Это в первую очередь побеждает цель упаковки кода. Если кто-то хочет разрешить использование внешних функций вашим пакетом, просто предоставьте API для их передачи пакету.

Сообщение об ошибке, которое вы видите, вызвано функцией 'mice:::check_method':

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

Мой обходной путь заключается в реэкспорте методов, используемых внутри «мыши» из моего собственного пакета (который внутри использует «мыши», как и ваш). Просто вставьте один из ваших файлов R и запустите на нем roxygen2:

#' @importFrom mice mice

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

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

Конечно, вам нужно будет экспортировать другие методы, если они используются для ваших данных.

Моя позиция такова, что если мне нужно загрязнить глобальную среду, я загрязню ее минимально, только функциями, необходимыми для работы «мыши».

person Daniel Lewandowski    schedule 14.12.2017

Вчера я получил ту же ошибку и открыл аналогичный вопрос (кстати, за него уже проголосовали). Сегодня я нашел решение, надеюсь, оно сработает и для вас, и, возможно, вы (или другие) сможете пролить на него немного больше света.

Я разрабатываю пакет R и использую roxygen2 для документирования функций. Я перечислил мышей в моем разделе импорта в файле описания, так как я должен использовать функцию mouse::mice. При сборке и проверке пакета все идет гладко, пока я не запускаю функцию, которая вызывает mouse::mice, и в этот момент я получаю ту же ошибку, что и вы.

Насколько я понимаю, это то, что вызывает проблему: в части документации функции, использующей мышь, вам нужно добавить этот бит:

#' @importMethodsFrom mice
#' @importFrom mice mice

Обратите внимание, что с большинством пакетов, которые я использовал до сих пор, следующей строки было бы более чем достаточно:

#' @importFrom mice mice

По-видимому, мыши требуют, чтобы вы также добавили директиву @importMethodsFrom. Я предполагаю, что это потому, что он использует классы S4, но я мало о них знаю, поэтому я просто знаю, что так это работает.

Я узнал об этом, прочитав раздел «S4» на этой странице: http://r-pkgs.had.co.nz/namespace.html#imports

Итак, чтобы вернуться к вашему конкретному случаю, я предполагаю, что документы для вашей функции должны выглядеть примерно так

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

Это отлично сработало для меня. Надеюсь, это поможет и вам.

person mickkk    schedule 02.06.2016