如何解决使用.Rbuildignore排除R文件夹的R文件
有些文件包含正在进行的工作,我想从整个构建过程中排除这些文件(检查,安装,甚至尽可能记录下来),但不进行加载(devtools::load_all()
)。
我总是将它们命名为dev-{feature}.R
,所以我要使用通配符,但是碰巧我甚至无法从构建中排除单个文件。
为了进行调试,我创建了一个R文件,名称为“ R / dev-myfeature.R”,仅包含行stop("TEST")
。然后,我运行usethis::use_build_ignore("R/dev-myfeature.R")
,将^R/dev-myfeature\.R$
添加到.Rbuildignore
文件中。
无论我运行devtools::load_all(".")
,devtools::check()
还是什至devtools::document()
,我都会遇到TEST
错误,因此.Rbuildignore
被忽略了。由于它可以与所有其他文件正常工作,因此我猜它在R
文件夹中没有任何功能。
有没有办法解决这个限制?
否则,对于尚不应该包含在构建中的正在进行中的文件,什么是一个好的工作流程?
解决方法
我认为.Rbuildignore
文件对捆绑您的包裹很有用,仅此而已。如果您想在R/*.R
文件中使用某些功能,但只在测试时在控制台上使用,则可以考虑使用包装的if
表达式来构造测试文件。
例如,我将使用名为MYDEV
的变量的存在和真实性来声明我要加载文件的内容。
if (exists("MYDEV") && MYDEV) {
stop("TEST")
}
在默认环境(未定义MYDEV
中,load_all
,check
和document
看不到错误。使用exists(...)
有助于确保在您的计算机上或其他地方的其他R实例中都不会出错(object not found
)。
如果设置MYDEV <- TRUE
,则所有devtools
函数将看到stop
并相应地出错。我认为没有(合理的)方法可以使load_all
中的代码来自document
,而 not 则不是。
使用devtools::document
错误 not 遇到的一个问题是它在内部调用devtools::load_all
,因为这样的简单测试无法正常工作。可以使用以下方法改编https://stackoverflow.com/a/62747050/3358272中的函数:
search_calling_pkg <- function(pkgs,funcs) {
# <borrowed from="rlang::trace_back">
frames <- sys.frames()
idx <- rlang:::trace_find_bottom(NULL,frames)
frames <- frames[idx]
parents <- sys.parents()[idx]
calls <- as.list(sys.calls()[idx])
calls <- purrr::map(calls,rlang:::call_fix_car)
#==# calls <- lapply(calls,rlang:::call_fix_car)
calls <- rlang:::add_pipe_pointer(calls,frames)
calls <- purrr::map2(calls,seq_along(calls),rlang:::maybe_add_namespace)
#==# calls <- Map(rlang:::maybe_add_namespace,calls,seq_along(calls))
# </borrowed>
calls_chr <- vapply(calls,function(cl) as.character(cl)[1],character(1))
ptn <- paste0("^(",paste(pkgs,collapse = "|"),")::")
pkgres <- any(grepl(ptn,calls_chr))
funcres <- !missing(funcs) && length(calls_chr) &&
any(mapply(grepl,paste0("(^|::)",funcs,"$"),list(calls_chr)))
return(pkgres && funcres)
}
如果找到任何程序包/函数对,则此函数返回true,并且此组合将“看到”(错误)stop("TEST")
与devtools::load_all
而不与devtools::document
:
if (search_calling_pkg("pkgload","load_all") &&
!search_calling_pkg("devtools","document")) {
stop("TEST")
}
是的,这意味着您需要在环境中的某个地方search_calling_pkg
,无论是否包含此软件包。回想一下,如果.Rbuildignore
文件包含R/dev-myfeature.R
,则软件包捆绑包和所有下游用户将永远不会看到此代码。如果您想更加防御,可以使用
if (exists("search_calling_pkg") &&
search_calling_pkg("pkgload","document")) {
stop("TEST")
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。