[英]How to use files in inst/extdata? R Package check prevent to use system.file() in R 3.6
我正在编写 R package 并尝试使用外部文件。 我将它放在inst/extdata
中并使用system.file("extdata", "file.csv", package = "mypackage")
将文件加载到我的 function 中。 官方手册仅描述了从inst/extdata
获取数据的这种方式。
但是在构建过程中我收到错误ERROR: hard-coded installation path: please report to the package maintainer and use '--no-staged-install'
论坛说system.file()
是不好的做法,但是我应该如何在 package 中使用行数据?
这个问题是在2018年更新之后出现的。我发现我可以在DESCRIPTION文件中使用StagedInstall: no
,但这是作弊,不是吗?
我想在函数内部使用原始文件(如预先计算的 static 表)和示例中的输入文件。 我的 R 版本是 3.6.2。
发生该错误是因为 package 源代码是在安装时执行的,而不是在加载 package 时执行的。 此外, 从 R 3.6 开始,软件包安装在临时路径中,而不是在其实际的最终安装位置。
因此,当在文件 scope 的 package 内(即不在函数内)直接调用时, system.file
将返回虚假路径。 这就是您收到的错误消息试图传达的内容。
一旦你知道了这一点,解决方案就相当简单了:在 package 构建期间不要调用system.file
。 相反,在package 加载期间调用它; 也就是说,在.onLoad
内部:
.onLoad = function (libname, pkgname) {
datafile = system.file("extdata", "file.csv", package = "mypackage")
assign('datafile', datafile, envir = topenv())
}
这会导致在 package 命名空间内创建变量datafile
,您现在可以从其他地方访问它。
论坛说
system.file()
是不好的做法
不,使用system.file
绝对不是坏习惯; 相反,它需要访问您的 package extdata。 不好的做法是在文件 scope 中调用 function。 但是在 function 中调用它是文件。
我发现我可以使用
StagedInstall: no
in DESCRIPTION 文件,但这是作弊,不是吗?
确实,这是“作弊”,绝对不推荐作为适当的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.