我的包示例中的system.file
命令有时会无法预测地失败,而在其他时间传递。我不懂为什么。
我通常使用:
> system.file("examples", "trees.xml", package="RNeXML", mustWork=TRUE)
通常有效,但有时会失败(即使在交互式会话中):
Error in system.file("examples", "trees.xml", package = "RNeXML", mustWork = TRUE) :
找不到文件
当它失败时,我可以让它工作:
> system.file("examples", "trees.xml", lib.loc = .libPaths()[1], package="RNeXML", mustWork=TRUE)
[1] "/home/cboettig/R/x86_64-pc-linux-gnu-library/3.0/RNeXML/examples/trees.xml"
这对我没有任何意义,因为system.file
的文档说如果没有提供libPaths
的值,它会自动检查lib.loc
。
那么,为什么我明确地给出.libPaths()[1]
会有效呢?
似乎明确地告诉我的包使用第一个路径.libPaths()[1]
,会不那么稳定。
答案 0 :(得分:6)
由于这是heisenbug,请设置options(error = recover)
,当系统提示输入帧编号时,请选择将您带入system.file
的帧编号。 (有关我将要解释的内容的更多信息,请参阅Hadley的Exceptions and Debugging tutorial。)然后逐步使用调试器并确定packagePath
是否使用find.package(package, lib.loc, quiet = TRUE)
正确加载。我检查了后一种功能,但没有发现任何错误,所以它可能是系统特定的。你可以张贴sessionInfo()
吗?
如果packagePath
没问题,那么答案就在system.file
其余部分的某处:
FILES <- file.path(packagePath, ...)
present <- file.exists(FILES)
if (any(present))
FILES[present]
else ""
这会让我们的生活变得非常困难,因为我怀疑这些功能是否存在任何问题。如果packagePath
不符合您的预期,您可以再次使用recover
帧编号提示返回system.file
,这次输入debug(find.package)
,以便您可以单步执行功能。在dirs
之后检查paths
和for (lib in lib.loc)
,然后逐步查看后面的几个if
。
如果这些都不起作用,并且您没有发现任何恶作剧(这对于逐步调试器的透明度非常困难),您可以尝试dump.frames
并上传文件我们。我不确定它会有多大用处,因为即使我们安装相同的软件包,也可能存在路径问题,但值得一试。
最后,如果您不关心以上所有内容,那么有效的黑客就是:
trees_path <- ""
for(lib in .libPaths()) {
trees_path <- system.file("examples", "trees.xml", lib.loc = lib, package="RNeXML", mustWork = FALSE)
if (trees_path != "") break;
}
if (trees_path == "") stop("examples/trees.xml not found using any library paths")