R 包:通过 system.file() 和 read.table() 从 R data.table 读取数据

R package: read in data via system.file() and read.table() from R data.table

我正在 /data 中创建一个包含多个文件的 R 包。在 R 包中加载数据的方式是使用 system.file()

system.file(..., package = "base", lib.loc = NULL, mustWork = FALSE)

我想将 /data 中的文件加载到 R data.table 中,其扩展名为 *.txt.gzmy_file.txt.gz。如何通过 read.table()fread() 将其加载到 data.table 中?

在 R 脚本中,我试过:

#' @import data.table
#' @export
my_function = function(){

    my_table = read.table(system.file("data", "my_file.txt.gz", package = "FusionVizR"), header=TRUE)    

}

这会通过 devtools document():

导致错误
Error in read.table(system.file("data", "my_file.txt.gz", package = "FusionVizR"), header = TRUE) (from script1.R#7) : 
  no lines available in input
In addition: Warning message:
In file(file, "rt") :
  file("") only supports open = "w+" and open = "w+b": using the former

我似乎通过 fread()

遇到了同样的问题
#' @import data.table
#' @export
my_function() = function(){

    my_table = fread(system.file("data", "my_file.txt.gz", package = "FusionVizR"), header=TRUE)    

}

这输出错误:

Input is either empty or fully whitespace after the skip or autostart. Run again with verbose=TRUE.

因此,system.file() 似乎没有为我可以加载到 R data.table 中的文件提供对象。我该怎么做呢?

帮自己一个大忙,仔细研究 fread():它是 data.table 中最好的功能之一。我有一些例子(在工作中)从其他命令的管道中读取,读取压缩数据等等。

这是一个简单的 mock 示例:

R> write.csv(iris, file="/tmp/demo.csv")
R> system("gzip /tmp/demo.csv")  # to be very plain
R> fread("zcat /tmp/demo.csv.gz")
      V1 Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
  1:   1          5.1         3.5          1.4         0.2    setosa
  2:   2          4.9         3.0          1.4         0.2    setosa
  3:   3          4.7         3.2          1.3         0.2    setosa
  4:   4          4.6         3.1          1.5         0.2    setosa
  5:   5          5.0         3.6          1.4         0.2    setosa
 ---                                                                
146: 146          6.7         3.0          5.2         2.3 virginica
147: 147          6.3         2.5          5.0         1.9 virginica
148: 148          6.5         3.0          5.2         2.0 virginica
149: 149          6.2         3.4          5.4         2.3 virginica
150: 150          5.9         3.0          5.1         1.8 virginica
R> 

似乎我一栏写得太多了(行名),但你明白了。

现在,您甚至不需要 fread(但它仍然比替代方案更强大):

R> head(read.csv(file="/tmp/demo.csv.gz"))
  X Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 1          5.1         3.5          1.4         0.2  setosa
2 2          4.9         3.0          1.4         0.2  setosa
3 3          4.7         3.2          1.3         0.2  setosa
4 4          4.6         3.1          1.5         0.2  setosa
5 5          5.0         3.6          1.4         0.2  setosa
6 6          5.4         3.9          1.7         0.4  setosa
R> 

R 自己发现它需要压缩文件。

编辑: 我早些时候在编辑这个问题时它被我删除了,这就像它得到的一样令人沮丧。简而言之:

  • system.file() 有效,例如file <- system.file("rawdata", "population.csv", package="gunsales") 是否 包含文件存在时的完整路径:"/usr/local/lib/R/site-library/gunsales/rawdata/population.csv"。但这很容易搞砸。 (不用说我确实有包和文件。)
  • 查看 data/ 目录以及 Writing R Extensions 所说的内容。这是一个很好的机制。