R:有时system.file无法正常工作

时间:2014-03-22 02:50:38

标签: r

我的包示例中的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],会不那么稳定。

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之后检查pathsfor (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")