我目前正在创建我的第一个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)
答案 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
和类似的例子中。