我正在编写 R 包并尝试使用外部文件。我将其放入
inst/extdata
并使用 system.file("extdata", "file.csv", package = "mypackage")
在我的函数中加载文件。官方手册只描述了这种从inst/extdata
获取数据的方式。
但是在构建过程中我收到了错误
ERROR: hard-coded installation path: please report to the package maintainer and use '--no-staged-install'
论坛说
system.file()
是不好的做法,但是我应该如何在包中使用行数据?
这个问题是2018年更新后出现的。我发现我可以在DESCRIPTION文件中使用
StagedInstall: no
,但这不是作弊吗?
我想在函数内部使用原始文件(作为预先计算的静态表)并在示例中作为输入文件。我的 R 版本是 3.6.2.
发生错误是因为包源代码是在安装时执行的,而不是在加载包时执行的。此外,从 R 3.6 开始,软件包安装在临时路径内,而不是实际的最终安装位置。 因此,当在文件范围的包内(即不在函数内)直接调用时,
system.file
将返回虚假路径。这就是您收到的错误消息试图传达的内容。
一旦你知道了这一点,解决方案就相当简单了:在包构建过程中不要调用system.file
。相反,在
包加载期间调用它;也就是说,在
.onLoad
内部:
.onLoad = function (libname, pkgname) {
ns = topenv()
ns$datafile = system.file("extdata", "file.csv", package = "mypackage")
}
(更多详情可以在相关答案
datafile
在您的包命名空间内创建,您现在可以从其他地方访问它。
论坛说system.file()
是不好的做法
不,使用
system.file
绝对是
不是不好的做法;相反,访问您的包扩展数据是“必需”的。不好的做法是在文件范围内调用该函数。但在函数内部调用它就可以了。 我发现我可以在描述文件中使用
StagedInstall: no
,但这是作弊,不是吗?
确实,这是“作弊”,绝对不推荐作为正确的解决方案。