在选定的环境中加载r包

时间:2016-03-16 23:11:54

标签: r r-package

我是R包开发和堆栈溢出的新手,但我一直无法在任何地方找到这些信息。

我试图加载R包鼠标,而不会污染我的命名空间。我尝试仅导入我正在使用的功能,但这并没有奏效。因此,我决定在一个特定的环境中加载整个软件包,如下所示:

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

但是,我还没有找到替换&#34; load_package_into_environment&#34;的实际功能。占位符。什么功能,如果有的话,会实现这一目标?

编辑:以下是我正在处理的文件以及我需要提供更多详细信息的问题。

文件:说明

Package: bug.example2
Title: Example of Package Loading Bug
Version: 0.0.0.9000
Authors@R: person("R", "Woodbridge", email = "example@gmail.com", 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(使用鼠标包中的鼠标功能)

#' @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 = ", ")))

2 个答案:

答案 0 :(得分:1)

内部打包'鼠标'是从全球环境中调用插补方法。根据作者的说法,这是为了允许提供您自己的定制方法来进行估算。因此,包也必须在全局环境中公开它们的默认实现。我认为这是纯粹判断的一个很好的例子 - 内部方法现在只能通过全局环境被包识别。这首先打败了打包代码的目的。如果想要允许包使用外部函数,那么只需提供一个API即可将它们传递给包。

您看到的错误消息由函数'mice ::: check_method':

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

我的解决方法是从我自己的包中重新导出'mouse'内部使用的方法(内部使用'mice',就像你的一样)。只需放入一个R文件并在其上运行roxygen2:

#' @importFrom mice mice

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

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

当然,如果您的数据使用了其他方法,则需要导出其他方法。

我的立场是,如果我需要污染全球环境,我将最低限度地污染它,只需要“鼠标”工作所需的功能。

答案 1 :(得分:0)

我昨天得到了同样的错误并打开了一个类似的问题(已经被bvw贬低了)。今天我找到了一个解决方案,我希望它对你也有用,也许你(或其他人)可以对它有更多的启发。

我正在开发一个R包并使用roxygen2来记录这些功能。我已经在描述文件中的导入部分列出了鼠标,因为我必须使用mice :: mice功能。在构建和检查包时,一切都运行顺畅,直到我实际运行调用mice :: 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){...}

这对我来说很好。希望它对你也有帮助。