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

时间:2015-01-09 08:44:02

标签: r package

我目前正在创建我的第一个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日志的建议:

  

“注意:使用R可以获得明显更好的压缩效果   CMD build --resave-data“

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

当然,我想我可以通过以下方式改变它:

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

但我真的很想知道这是否是处理R包中文本文件的好方法。这在我看来有点“棘手”。 这是一个“好习惯”吗? 不加载文本文件只是简单访问文本文件的另一种方法吗?有人已经有同样的情况吗?

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

1 个答案:

答案 0 :(得分:3)

您放置在data文件夹中的数据集将通过data()功能提供给用户,该功能旨在仅使用load()read.table()加载数据。如果您希望在R包中包含其他非标准文件,请将它们放在inst目录中,它们将在安装后显示在包的根目录中,并可通过system.file()进行检索。

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

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和类似的例子中。