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

时间:2018-04-28 16:45:41

标签: r r-markdown knitr r-package

我使用child块模块化了我的插图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://stackoverflow.com/a/49463061/4468078表示RStudio使用package文件夹以root身份构建vignet(这可以解释为什么找不到文件)。

更新2:

如果已经创建了一个可重复性最小的示例包以及github上的发现摘要:

https://github.com/aryoda/R_pkg_knitr_child_vignette_issue

更新3:

我在knitrhttps://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 个答案:

答案 0 :(得分:1)

这看起来像一个bug(或者可能不止一个)。我可能把它称为R中的一个错误,但它可能是knitr中的一个错误。在构建tarball时,R会将主文件复制到inst/doc,而不是子文件。 knitr然后查看它,因为它没有看到孩子,它会退出。

要获取要构建的包,只需在inst/doc中使用与子文件同名的空文件。但这还不足以通过检查。

检查包时,R会看到该子文件位于inst/doc,并因为它不是一个合适的插图而感到沮丧。所以你需要欺骗R认为它是一个。

据我所知,这是一个简单(虽然难看)的解决方法。只需将名为child_doc.Rmd的文件放入inst/doc目录即可。为了让R认为它是一个小插图,复制行

  %\VignetteIndexEntry{title}
  %\VignetteEngine{rmarkdown::render}
  %\VignetteEncoding{UTF-8}

来自主文件。否则,内容似乎无关紧要,所以我不会在那里放任何东西。

将真实的child_doc.Rmd文件放入vignettes目录。我想如果你这样做,你的软件包将构建并检查没有错误。

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

太糟糕了,解决方法非常难看,一旦修复了错误,可能会导致其他问题。