【问题标题】:Adding and accessing package files to a new R package将包文件添加和访问到新的 R 包
【发布时间】:2017-10-27 20:12:04
【问题描述】:

我在 RStudio v. 1.0.1.153 中创建了一个新项目作为“R 包”。默认情况下,这样一个新的 R 包项目带有包含模板函数的文件 hello.R

hello <- function() {
  print("Hello, world!")
}

可以通过构建和重新加载包(Ctrl+Shift+B)来访问它,然后在另一个 R 会话中只需加载构建的包并运行函数:

> library(mylibrary)
> hello()
[1] "Hello, world!"

现在我想将我的函数组织到包中的几个文件中。我将一个新文件methods.R 添加到具有另一个功能的包的.\R\ 子目录中:

helloYouToo <- function() {
  print("Hello you too!")
}

但是,当我重建包并重新加载库时,我无法访问该函数:

> library(mylibrary)
> helloYouToo()
Error in helloYouToo() : could not find function "helloYouToo"

我有几个问题。我该怎么做

  1. 将包函数分成几个文件(不仅仅是单个hello.R文件),以便将其中定义的文件和函数包含在包中,并且
  2. 包内访问在同一个包内但在另一个文件中(如methods.R)定义的此类函数的首选方法是什么?

【问题讨论】:

  • 我尝试阅读一些关于添加文件的初学者手册,但他们似乎专注于建议将包的所有功能写入单个文件。
  • 你在NAMESPACE页面中导出函数了吗?您是否使用 roxygen 来构建文档?您是只选择“R 包”还是“使用 devtools 的 R 包”?如果您还没有,您可能应该阅读Hadley's R packages guide
  • 我使用的是 R 3.4.2,最近才可以安装 devtools。所以我安装了 devtools 并尝试运行安装了 roxygen 的devtools::load_all()。然后运行devtools::load_all() 使helloYouToo() 在我创建包的R 会话中可用。但是,它没有使该功能在另一个 R 会话中可用。令人惊讶的是,重新启动另一个 R 会话有所帮助,之后 library(mylibrary) 使 helloYouToo() 可用。
  • 是否真的需要重启 R 会话才能更新包函数定义?

标签: r rstudio r-package


【解决方案1】:

正如@MrFlick 建议的那样,我设法通过安装devtoolsroxygen(带有依赖项)将函数拆分为多个文件。

在重建包之后,其他文件中的新功能可供加载包的用户使用。但是,必须重新启动 R 会话才能使更新的函数定义可用:

Restarting R session...

> library(mylibrary)
> helloYouToo()
[1] "Hello you too!"

甚至可以在包中定义一个函数,该函数使用两个单独文件中定义的函数:

helloDouble <- function() {
  hello()
  helloYouToo()
}

导致

Restarting R session...

> library(mylibrary)
> helloDouble()
[1] "Hello, world!"
[1] "Hello you too!"

我不需要触摸 NAMESPACE 文件,因为它和它一样通用

exportPattern("^[[:alpha:]]+")

允许我在包中创建的所有新功能可供包用户使用。

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多