【问题标题】:devtools build_vignette can't find functionsdevtools build_vignette 找不到函数
【发布时间】:2016-06-14 03:36:37
【问题描述】:

如果我在包中使用devtools::use_vignette("my-vignette"),则运行devtools::build_vignette() 可以正常工作。

但是,一旦我从包中添加了对任何内容的调用,它就会停止工作,并出现错误 could not find function "myfunc"。如果我添加一个library(mypackage) 调用,我会收到错误there is no package called 'mypackage'

(我应该注意我的包检查、构建和安装非常干净[没有小插图],并且运行 devtools::load_all() 也适用于交互式会话。)

我知道,如果我构建并安装我的包,我就可以构建小插图。这似乎是一种非常低效且危险的开发方式;基本上迫使我在每次提交时重新构建和重新安装整个包,以测试小插图没有破坏。

还有其他方法可以让小插图识别正在进行的包吗?

【问题讨论】:

  • FWIW:我遇到了类似的问题,并意识到我没有导出我的函数(在 .R 文件中使用 @export,然后使用 roxygen 生成带有导出命令的 NAMESPACE)。 NAMESPACE 文件是否导出了晕影构建时找不到的函数?

标签: r devtools


【解决方案1】:

我知道已经有了答案,但这就是我在使用手写小插图时解决相同问题的方法。

我不确定这是否适用于 build_vignette() 但是当我因为同样的错误而无法编织我的小插图时,我必须做的是:

  1. <path/to/your/Rpackage>/NAMESPACE 我必须为要在小插图中使用的每个函数添加 export(myFuncName) 以及一次 useDynLib(myPackageName)
  2. 我必须在 <path/to/your/Rpackage>/DESCRIPTION 文件中为我指定一个 VignetteBuilder 选项,它是 VignetteBuilder: knitr

【讨论】:

    【解决方案2】:

    如果你在 github 中查找 Hadley Wickham 的包,你会看到他在他的小插图顶部包含一个库(xyz),例如https://github.com/tidyverse/dplyr/blob/master/vignettes/dplyr.Rmd

    然后his recommended 构建小插曲的方式有效:

    您可以使用控制台构建所有小插曲 *devtools::build_vignettes()*,但这很少有用。反而 使用devtools::build() 创建带有小插图的包包 包括在内。

    我相信这是您向 CRAN 提交包裹所需要的。

    不过,这是一个缓慢的开发周期,因此对于主动编码,您可以插入带有 devtools::load_all() 的行以在 RStudio 中使用编织。

    【讨论】:

      【解决方案3】:

      如果您使用的是 RStudio IDE(这对软件包开发很有帮助),您可以通过单击 Knit 按钮来渲染由devtools::use_vignette 创建的 Rmd 文档。它将创建您的小插图的预览版本。 顺便说一句,RStudio IDE 为您提供了有用的快捷键和按钮来逐块执行您的 Rmd 文档以测试它是否正常工作。

      如果您没有使用 RStudio IDE,您可以使用函数 rmarkdown::render 来渲染您的文档而无需构建包。

      但是,为了正常工作,您的小插图需要加载您的包。所以,正如你所说,你必须打电话给library(mypackage),所以你的包必须被安装。
      您可以使用devtools::install(build_vignette = FALSE) 在命令行中安装没有小插图的软件包。在 RStudio IDE 中,按钮 Build & Reload 足以安装您的包。`

      对于非 Rstudio IDE 用户的另一种解决方案是在您的小插图中使用devtools::load_all(path to your package),以模拟在小插图环境中安装您的包。然后您可以使用devtools::build vignette 构建您的小插图,而无需之前安装您的包。

      我应该强调,小插图是在您构建包时自动构建的。因此,当开发完成后,将小插图中的 devtools::load_all 替换为 library,因为在构建包时,您的包是在构建小插图之前加载的。

      【讨论】:

      • 感谢您的评论,但这根本没有回答我的问题。
      • 这是我开发时的工作方式。如果您执行devtools::load_all 然后在不构建 小插图的情况下执行文档中的所有 r 块,它们将在您的环境中运行,以便找到您的打包函数。否则,devtools::install + rmarkdown::render 应该可以工作:你试过吗?您也可以在小插图开头尝试devtools::load_all(path_to_your_package_folder),以模拟编织时的安装。值得一试。
      • 使用devtools::load_all 有效,尽管它确实增加了对开发工具的不希望的依赖。如果您将其编辑到您的答案中,我会接受它。
      • 我编辑了小插图。对我来说,不应将 devtools 添加为依赖项,因为当您想要发布软件包时,您应该在小插图中使用“库”。它应该可以工作,因为构建包也会在加载包后构建小插图。
      • 在小插图中使用devtools::load_all() 对包运行检查会创建一个注释'::' or ':::' import not declared from: ‘devtools’。授予它只是一个注释(所以我可以忽略它),但我更愿意限制包裹可能被 CRAN 拒绝的原因。
      猜你喜欢
      • 2013-10-15
      • 2019-10-23
      • 2020-11-12
      • 2015-01-10
      • 2020-03-29
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多