【问题标题】:create and document a package with R6 classes使用 R6 类创建和记录包
【发布时间】:2016-02-23 15:20:40
【问题描述】:

感谢 RStudio、devtools 和 roxygen2,我目前正在使用 R6 类创建我的第一个 R 包 (:D)。当我的包只包含函数时,我可以毫无问题地构建和加载它。但是当我想记录 R6 类时(在这个包https://cran.r-project.org/web/packages/data.tree/data.tree.pdf 中使用像“Node”这样的字段和方法),RStudio 不想构建包。我试图在论坛上找到窍门,但是关于这个问题的信息非常稀缺

我的程序:

  1. 打开Rstudio,新建一个项目,我选择“R包”
  2. 我填写了包的名称,并选择了我的包所基于的源文件(一个函数和 3 个类)。

-> 在这一点上,程序没问题,因为我用“man”和我的不同类的描述获得了正确的结构,“R”用这些类的不同脚本获得了正确的结构。

但是当我尝试构建和重新加载包(预先加载了 R6 包)时,会出现错误:

==> R CMD INSTALL --no-multiarch --with-keep.source esa

* installing to library ‘/home/cha/R/x86_64-pc-linux-gnu-library/3.0’
* installing *source* package ‘esa’ ...
** R
** preparing package for lazy loading
Error in eval(expr, envir, enclos) :
  impossible de trouver la fonction "R6Class" (translation: impossible to find the function "R6Class")
Error : unable to load R code in package ‘esa’
ERROR: lazy loading failed for package ‘esa’
* removing ‘/home/cha/R/x86_64-pc-linux-gnu-library/3.0/esa’
* restoring previous ‘/home/cha/R/x86_64-pc-linux-gnu-library/3.0/esa’  

Exited with status 1. 

我不明白如何解决这个错误,因为 Rstudio 是对的:R6Class 不是函数!

我的问题:

我的程序正确吗?我该如何解决这个错误?

我需要知道 Rstudio 是否能够在 R 包构建中考虑 R6 类? 如果没有,我可以手动完成,但我只需要知道以停止尝试使用 RStudio 的时间:)

提前感谢您的帮助!!

【问题讨论】:

  • 您分享了您遇到的错误,但没有分享生成它的实际代码。请提供最小的reproducible example
  • 事实上,没有那么多代码,因为我使用 RStudio 完成了所有过程(如我在问题中详述的步骤中所述)。我只有我的 R6class 代码(一个非常基本的代码): elem

标签: r class rstudio


【解决方案1】:

非常感谢麦克弗里克!!

我刚刚收到了 R6Class 包开发人员的答复。他们告诉我,我只需要添加一行

importFrom(R6, R6Class)

在命名空间文件中。它工作正常! (我永远不会单独找到它:S)

此外,要添加一些项目,例如继承、字段和方法,他们建议以具有预期结构的包中的 .Rd 为例。

他们终于推荐了一本书http://r-pkgs.had.co.nz/,我想我会读的!!

再次感谢大家

【讨论】:

  • 更一般地说,如果您打算使用来自不同包的函数(或类似函数的对象),我相信您需要执行您在此处指出的操作(NAMESPACE 中的importFrom(package, function) ) 或使用 :: 运算符,只要您使用该函数直接引用它来自的包 (package::function)。在这种情况下,在定义类时,您将使用R6::R6Class
  • 如果你用roxygen2 为你的包构建文档,你实际上不应该修改你的NAMESPACE 文件。如上文 Nikhil 所述,应将其添加为 roxygen 标记 @importFrom。如果您选择使用 :: 运算符引用包,正如 Paul 所说 - 请记住将您引用的包(在本例中为 R6)添加到说明文件中的 Imports
【解决方案2】:

也许您应该在使用 R6 类的 .R 文件中包含以下内容,并让“devtools”负责创建 NAMESPACE 文件

#' @importFrom R6 R6Class   

> devtools::check() # Will create the NAMESPACE file for you

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多