R包创建:对如何处理文本数据感到困惑

R package creation: Confused about how to handle text data

我目前正在创建我的第一个 R 包,我对处理文本数据的方式感到困惑。 我很清楚数据集必须放在 ./data 子目录中,保存为 .rda、.txt 或 .csv 格式之一,然后可以使用 data() 函数加载。

然而,data()函数与read.table()函数相同,也就是说它读取文本文件(.txt或.csv)并将其加载到data.frame. 这不是我想要的:我只想访问我的文本文件(.txt 或 .csv)并使用我在包的 R 源代码中开发的自己的阅读功能加载它。 (这是一个特殊的读取功能,根据包的期望进行特殊检查)。

在网络上阅读了大量主题后,我发现 system.file() 函数很有用,并以这种方式使用它,在我的测试文件中:

current_dir=system.file(package="MYPACKAGE")
myTextFile=paste(current_dir,"/data/myTextFile.csv",sep="")
# Then I use my own function to load it:
myOwnReadingFunction(myTextFile)

这很好用,我的 R CMD check 也很顺利....直到我听从 R CMD check 日志的建议:

"Note: significantly better compression could be obtained by using R CMD build --resave-data"

R CMD check 之前给 R CMD build --resave-data 小费,将我的 .csv 文件移动到 .csv.bz2 和 .csv.xz! 所以我在我的测试文件中写的(见上文)现在不起作用。

当然我想我可以,例如,通过以下方式更改它:

myTextFile=paste(current_dir,"/data/myTextFile.csv.bz2",sep="")

但我真的想知道这是否是处理 R 包中文本文件的好方法。这在我看来有点"tricky"。 这是"good practice"吗? 是不是另一种无需加载就可以简单地访问文本文件的方法?有人遇到过同样的情况吗?

额外问题:为什么 R CMD build --resave data 不对我的两个 .csv 文件使用相同的压缩? (即:.bz2 和 .xz)

您放置在 data 文件夹中的数据集将通过 data() 功能提供给用户,该功能旨在仅使用 load()read.table() 加载数据.如果你想在你的 R 包中包含其他非标准文件,请将它们放在 inst 目录中,一旦安装它们将出现在你的包的根目录中,并且可以使用 system.file().[=26= 检索]

换句话说,您的目录结构在打包和检查之前应该如下所示:

MyPackage/data
MyPackage/inst/extdata   <-- Your data
MyPackage/man
MyPackage/R
...

安装后像这样

MyPackage/data
MyPackage/extdata   <-- Your data
MyPackage/man
MyPackage/R
...

您的文件现在可以像这样访问

system.file("extdata", "myTextFile.csv", package="MyPackage")

有关此解决方案的示例,请查看 EBImage 包,其中包含许多图像形式的非标准文件。与您的文本文件一样,它们无法使用 data() 加载,因此改为使用

system.file("images", "lena-color.png", package="EBImage")

用于?readImage和类似的例子。