【问题标题】:R package: read in data via system.file() and read.table() from R data.tableR 包:通过 system.file() 和 read.table() 从 R data.table 读取数据
【发布时间】:2017-12-07 00:05:38
【问题描述】:

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

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

/data 中的文件我想加载到 R 数据表中,扩展名为 *.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 中的文件提供对象。我该怎么做呢?

【问题讨论】:

  • 两步可以做: 1、system.file 找到文件了吗?在执行读取步骤之前通过file.exists 检查。 2.如果它确实找到了文件,read.csv能应付吗?通过在命令行上使用文件的完整路径运行 read.csv 进行测试。也许您的 R 版本没有 gzip 读取功能?
  • 为了帮助我们帮助您,请将您的代码或说明问题的小示例放在 github 等公共站点上。 R 包可能很繁琐,人们在它们上使用了一系列工具。我很惊讶devtools::document() 正在在您的函数中运行代码,除非它正在运行的测试或您没有向我们展示的示例。
  • @Spacedman 谢谢你的帮助。我在包根目录中运行library(devtools),然后运行document()。正如 system.file() 在编写 R 扩展中记录的那样,这个问题应该被关闭,因为研究不足或因英语不好而修改。
  • 另外,这是错误的:my_function() = function(){ - 你没有将() 放在函数名中:它应该是:my_function = function(){。当我在一个最小示例上运行 document 时,我看到了这个警告:"Error in my_function() = function() { (from fnord.R#1) :"
  • @Spacedman 谢谢。已编辑。我的错字。

标签: r data.table r-package


【解决方案1】:

帮自己一个大忙,仔细研究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/ 目录以及编写 R 扩展 的内容。这是一个很好的机制。

【讨论】:

  • 我通常将fread() 用于data.table。出于某种原因,我在上面使用了read.table——这两个函数都存在错误。
猜你喜欢
  • 2015-12-12
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多