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