我是R包开发和堆栈溢出的新手,但我无法在任何地方找到这些信息.
我正在尝试加载R包鼠标,而不会污染我的命名空间.我尝试只导入我正在使用的函数,但这没有用.所以我决定在一个特定的环境中加载整个包,如下所示:
e <- new.env()
load_package_into_environment(e, package = "mice")
eval(mice(data, m = m, maxit = max.iter, printFlag = F), envir = e)
Run Code Online (Sandbox Code Playgroud)
但是,我无法找到替换"load_package_into_environment"占位符的实际函数.什么功能,如果有的话,会实现这一目标?
编辑:这是我正在使用的文件和问题,我不得不提供更多细节.
文件描述
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
Run Code Online (Sandbox Code Playgroud)
文件: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)
Run Code Online (Sandbox Code Playgroud)
文件: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
}
Run Code Online (Sandbox Code Playgroud)
文件:test-impute.R(使用testthat包来测试impute函数)
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")
})
Run Code Online (Sandbox Code Playgroud)
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 = ", ")))
Run Code Online (Sandbox Code Playgroud)
我昨天遇到了同样的错误,并提出了一个类似的问题(顺便说一句,该问题已经被否决)。今天我找到了一个解决方案,我希望它也适合您,也许您(或其他人)可以对它有更多了解。
我正在开发一个 R 包并使用 roxygen2 来记录函数。我在描述文件的导入部分中列出了小鼠,因为我必须使用 mouse::mice 函数。在构建和检查包时,一切都运行顺利,直到我实际运行调用 mouse::mice 的函数,此时我得到了与您得到的完全相同的错误。
据我的理解,这就是导致问题的原因:在使用鼠标的函数的文档部分中,您需要添加这一点:
#' @importMethodsFrom mice
#' @importFrom mice mice
Run Code Online (Sandbox Code Playgroud)
请注意,对于迄今为止我使用过的大多数软件包,以下行就足够了:
#' @importFrom mice mice
Run Code Online (Sandbox Code Playgroud)
显然,老鼠也要求您添加 @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){...}
Run Code Online (Sandbox Code Playgroud)
这对我来说效果很好。希望它对你也有帮助。