【问题标题】:Configuring NAMESPACE and DESCRIPTION when using a Suggested Package使用建议包时配置 NAMESPACE 和DESCRIPTION
【发布时间】:2017-09-04 20:59:20
【问题描述】:

我编写了一个使用rstudioapi::viewer() 函数的R 包。显然,并不是每个人都使用 RStudio。我现在绕着圈子试图正确配置NAMESPACEDESCRIPTION

为了不强迫用户安装他们不需要的软件包(和/或在他们的系统上无用),我尝试将 rstudioapi 放在 Suggests 部分并视其可用性而定:

if(.Platform$GUI == "RStudio") {
  if ("rstudioapi" %in% rownames(installed.packages())) {
    rstudioapi::viewer(outfile_path)
  } else {
    message("To view html content in RStudio, run install.packages('rstudioapi').")
    message("Switching method to 'browser'")
    method <- "browser"
  }

但是在R CMD CHECK,我得到:

checking dependencies in R code ... WARNING
'::' or ':::' import not declared from: 'rstudioapi'

所以我去声明它,将importFrom(rstudioapi, viewer) 添加到我的NAMESPACE。结果:

checking package dependencies ... ERROR
Namespace dependency not required: 'rstudioapi'

回到official docs,我也尝试了以下方法:

if (requireNamespace("rstudioapi", quietly = TRUE)) {
    rstudioapi::viewer(outfile_path)
  } else { ...

无济于事:

checking dependencies in R code ... WARNING
'::' or ':::' import not declared from: 'rstudioapi'
'loadNamespace' or 'requireNamespace' call not declared from: 'rstudioapi'

所以我要么因未声明而收到警告,要么因声明而收到错误。如果你不这样做该死的,如果你做某事更该死。任何帮助表示赞赏。

【问题讨论】:

  • 如果rstudioapiR 目录中的任何代码中使用,您应该将它添加到您的DESCRIPTION 文件中的ImportsSuggests 适用于在您的示例或小插图中运行的代码,但未在实际代码中使用。
  • 不是根据官方文档...请参阅cran.r-project.org/doc/manuals/r-release/R-exts.html 中的第 1.1.3.1 节...可以预期某些代码将在某些平台上相关而不是其他平台,所以我很确定一定有解决方案...
  • 问题已解决...请参阅下面我自己的答案。
  • 我的立场是正确的。

标签: r namespaces package rstudio


【解决方案1】:

我有一些想法可能会有所帮助。

参考 Hadley Wickham 的在线 R 包书籍可能会很有用:http://r-pkgs.had.co.nz/description.html。我从他的书中了解到了我对包裹的大部分(很少)了解。

我认为您可以将包rstudioapi 添加到您的说明文件中,在“建议”字段下使用以下代码:

   devtools::use_package("rstudioapi", "Suggests")

我一直使用Roxygen2 包(以及最近的devtools)与NAMESPACE 文件进行交互,所以我不手动编辑NAMESPACE。

这是我的说明文件的样子:

    Package: stack3
    Type: Package
    Title: What the Package Does (Title Case)
    Version: 0.1.0
    Author: Who wrote it
    Maintainer: The package maintainer <yourself@somewhere.net>
    Description: More about what it does (maybe more than one line)
               Use four spaces when indenting paragraphs within the Description.
    License: What license is it under?
    Encoding: UTF-8
    LazyData: true
    Suggests:
         rstudioapi
    RoxygenNote: 5.0.1

然后我跑了

    devtools::build()

获取 stack3_0.1.0.tar.gz 文件。请注意,我将我的包命名为stack3。在运行 R CMD CHECK stack3_0.1.0.tar.gz 时,我看到我没有收到任何错误和一个警告。警告是由于在说明文件中默认遵循许可证:的文本。

    R CMD CHECK stack3_0.1.0.tar.gz
    * using log directory ‘/Users/frederickboehm/Box Sync/stack3.Rcheck’
    * using R version 3.3.3 (2017-03-06)
    * using platform: x86_64-apple-darwin13.4.0 (64-bit)
    * using session charset: UTF-8
    * checking for file ‘stack3/DESCRIPTION’ ... OK
    * checking extension type ... Package
    * this is package ‘stack3’ version ‘0.1.0’
    * package encoding: UTF-8
    * checking package namespace information ... OK
    * checking package dependencies ... OK
    * checking if this is a source package ... OK
    * checking if there is a namespace ... OK
    * checking for executable files ... OK
    * checking for hidden files and directories ... OK
    * checking for portable file names ... OK
    * checking for sufficient/correct file permissions ... OK
    * checking whether package ‘stack3’ can be installed ... OK
    * checking installed package size ... OK
    * checking package directory ... OK
    * checking DESCRIPTION meta-information ... WARNING
    Non-standard license specification:
      What license is it under?
    Standardizable: FALSE
    * checking top-level files ... OK
    * checking for left-over files ... OK
    * checking index information ... OK
    * checking package subdirectories ... OK
    * checking whether the package can be loaded ... OK
    * checking whether the package can be loaded with stated dependencies ... OK
    * checking whether the package can be unloaded cleanly ... OK
    * checking whether the namespace can be loaded with stated dependencies ... OK
    * checking whether the namespace can be unloaded cleanly ... OK
    * checking loading without being on the library search path ... OK
    * checking examples ... NONE
    * checking PDF version of manual ... OK
    * DONE

    Status: 1 WARNING
    See
      ‘/Users/frederickboehm/Box Sync/stack3.Rcheck/00check.log’ for details.

我希望我理解了您的问题,并且此回复对您有所帮助。

【讨论】:

  • 感谢您的回答。似乎 HW 的页面根据官方文档解释了我上次尝试的内容...在您的代码(不包括示例/小插图)中,您是否包含条件执行,例如 if (requireNamespace("pkg", quietly = TRUE)) { pkg::f() }
  • 我不确定我是否理解你的问题,但我认为当你的代码中有代码时,你想用 rstudioapif 替换 fviewer包含对rstudioapi::viewer() 的调用的包。那有意义吗?还是我误会了什么?
  • 我不确定您是否需要编辑 NAMESPACE 文件。
  • “pkg”和“f”只是任何包和功能的占位符,所以你的第一个问题是肯定的。我的意思是,如果您实际上并未在代码中使用它,只需将包名称添加到 Sugests 列表中可能会很好...所以我很想知道您是否确实在您的代码中使用了任何建议的包的功能是否拥有包的功能。
  • 对于 NAMESPACE 文件,我不知道有什么工具可以自己生成一个功能齐全的文件,除非包真的很简单。例如,Roxygen 可以生成导出,但仅此而已!
【解决方案2】:

我知道为什么会出现这些警告/错误。当我将rstudioapi 添加到Suggests: 列表时,我无意中创建了一个second Suggests: 列表。只考虑了第二个(是的,现有的在DESCRIPTION文件的底部,我完全错过了它。我不会删除它以防它发生在其他人身上......

【讨论】:

  • 谢谢。那只是发生在我身上:-)
【解决方案3】:

我想到的另一个选择是根本不在您的DESCRIPTION 文件中的任何位置列出rstudioapi。 RStudio 有 tips for using the viewer 可能会有所帮助,并且不需要依赖于 rstudioapi

他们的建议是使用

viewer <- getOption("viewer")
if (!is.null(viewer))
  viewer("http://localhost:8100")
else
  utils::browseURL("http://localhost:8100")

这很有效,因为在启动时,RStudio 创建了一个名为viewer 的选项并用一个函数填充它。如果您不使用 RStudio,getOption("viewer") 将返回 NULL,您可以将其重定向到使用系统的默认浏览器。这基本上是您已经完成的工作,但不需要额外的依赖项。

这还具有比检查installed.packages 快约 1000 倍的好处,但这仍然以纳秒为单位,所以可能不是一个大问题(警告,我只安装了 192 个包。它可能需要更长的时间已下载 CRAN 上所有内容的系统)。

【讨论】:

  • 这就像一个魅力。当我看到0 errors | 0 warnings | 0 notes 时,我总是有一种满足感:D
猜你喜欢
  • 2020-06-07
  • 2012-02-01
  • 2022-01-02
  • 2020-07-19
  • 1970-01-01
  • 2014-12-01
  • 2017-04-24
  • 2016-05-06
  • 2018-04-30
相关资源
最近更新 更多