包构建失败,因为vignette找不到子Rmd文件。

4

我使用child代码块将vignette Rmd文件模块化,以便能够在其他Rmd文档中重用子Rmd文件。

在RStudio和R CMD build .中构建软件包时会出现错误消息:

** installing vignettes
   ‘Vignette.Rmd’ using ‘UTF-8’ 
Warning in readLines(if (is.character(input2)) { :
  cannot open file 'child_doc.Rmd': No such file or directory
Quitting from lines 10-11 (child_doc.Rmd) 
Error in readLines(if (is.character(input2)) { : 
  cannot open the connection
ERROR: installing vignettes failed

如何构建我的包(让R找到我的子Rmd文件)?

示例Rmd文件:

Vignette.Rmd

---
title: "title"
author: "me"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{title}
  %\VignetteEngine{rmarkdown::render}
  %\VignetteEncoding{UTF-8}

main doc

```{r child = "child_doc.Rmd"}
```

child_doc.Rmd:

# This is from the child doc
lorem ipsum

更新1:

https://dev59.com/m1wX5IYBdhLWcg3wnwcy#49463061 表明 RStudio 使用包文件夹作为根目录来构建文档(这可以解释文件找不到的问题)。

更新2:

我已经在 GitHub 上创建了一个最小可重现示例包,还附有发现的摘要:

https://github.com/aryoda/R_pkg_knitr_child_vignette_issue

更新3:

我已经在 knitr 上开了一个问题(https://github.com/yihui/knitr/issues/1540),但是 @user2554330 已经确定 tools 命名空间是问题的原因之一...

更新4:

请参阅 Duncan Murdoch 开放的 Bugzilla bug 条目:https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=17416

1个回答

1
这看起来像是一个 bug(或者可能不止一个)。我可能会称其为 R 中的 bug,但它也可能是 knitr 的 bug。当你构建 tarball 时,R 会将主文件复制到 inst/doc,但不会复制子文件。然后 knitr 检查它,由于它没有看到子文件,因此退出。
要使软件包能够构建,您只需要在 inst/doc 中放置一个与子文件同名的空文件即可。但这还不足以通过检查。
在检查软件包时,R 将看到子文件位于 inst/doc 中,并因其不是适当的 vignette 而感到沮丧。因此,您需要欺骗 R 让它认为它是一个 vignette。
就我所见,有一个简单的(虽然丑陋的)解决方法。只需将名为 child_doc.Rmd 的文件放入 inst/doc 目录中即可。为了让 R 认为它是一个 vignette,请复制这些行。
  %\VignetteIndexEntry{title}
  %\VignetteEngine{rmarkdown::render}
  %\VignetteEncoding{UTF-8}

来自主文件。否则,内容似乎与此无关,因此我不会在那里放任何其他内容。

将真正的child_doc.Rmd文件放入vignettes目录中。我认为如果你这样做,你的包将可以构建和检查而没有错误。

这可能值得一个错误报告,但我不确定修复应该是什么。也许knitr应该在其检查中更加宽容,或者R应该更早地复制文件。

太糟糕了解决方法如此丑陋,并且一旦修复了错误,可能会引起其他问题。


很好的分析!我也会将其归类为bug。如果你(在不应用你描述的解决方法的情况下)调用devtools::build_vignettes(),会发生什么?此后,在构建或检查期间我再也没有收到任何错误或警告了,但是inst/doc仍然没有包含子Rmd文件。 - R Yoda
编译通过了,但是在我的检查中失败了。 - user2554330
我也在使用R3.4.4(在Linux上),明天我会尝试在Windows和另一个R版本上构建。感谢您的帮助,我现在正在调试代码并尝试确定R或knitr是否是问题的源头,以便能够打开一个问题。目前看来,如果使用正确的参数调用tools::buildVignettes(R CMD build + check调用此函数),它不是问题所在。由于您提供了解决方法,我将接受您的答案。谢谢! - R Yoda
问题似乎出在 tools::.install_package_vignettes2 中,它在没有复制所有文件的情况下在 doc 目录上调用 tools::pkgVignettes。我将提交一个错误报告。 - user2554330
哇,深入代码探索 :-) 很高兴听到这个消息。我已经在 Github 上为 knitr 打开了一个问题,也许你可以链接你的票以便有更全面的了解:https://github.com/yihui/knitr/issues/1540 - R Yoda
Duncan Murdoch已经为R提交了一个错误报告,请参见:https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=17416 - R Yoda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接