【发布时间】: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"
我有几个问题。我该怎么做
- 将包函数分成几个文件(不仅仅是单个
hello.R文件),以便将其中定义的文件和函数包含在包中,并且 - 在包内访问在同一个包内但在另一个文件中(如
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 会话才能更新包函数定义?