繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM