如何使用inst/extdata中的文件? R 包检查阻止在 R 3.6 中使用 system.file()

问题描述 投票:0回答:1

我正在编写 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 filepath r-package
1个回答
4
投票

发生错误是因为包源代码是在安装时执行的,而不是在加载包时执行的。此外,从 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

,但这是作弊,不是吗?

确实,这是“作弊”,绝对不推荐作为正确的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.