包编译和相对路径

时间:2014-09-19 16:50:31

标签: r path package

我一定非常困惑。环顾四周但却找不到合适的答案,感觉我做错了什么。

这是一个极简主义的例子: 我的函数test从文件夹导入文件,然后对该文件进行后续分析。我在path = "inst/extdata/input_data"

指定的文件夹中有几十个压缩文件
test = structure(function(path,letter) {
  file = paste0(path, "/file_",letter,".tsv.gz")
  data = read.csv(file,sep="\t",header=F,quote="\"",stringsAsFactors=F)

  return(mean(data$var1))

}, ex = function(){
  path = "inst/extdata/input_data"
  m1 = test(path,"A")
})

我正在使用包目录的文件夹R/中的函数构建一个包。

当我将工作目录设置为包父并逐行运行示例时,一切都很顺利。但是,当我使用R CMD check检查包时,它会给我以下内容:

cannot open file 'inst/extdata/input_data/file_A.tsv.gz': No such file or directory
Error in file(file, "rt") : cannot open the connection

我想在检查和构建包时,工作目录会自动设置为包的父目录(在我的例子中是"C:/Users/yuhu/R/Projects/ABCDpackage"但似乎并非如此。

在这种情况下,最佳做法是什么?我会避免转换.rda格式的所有数据并将其放在data文件夹中,因为文件太多了。有没有办法编译包并在函数示例中设置包所在的相对工作目录?这在分发包时也会有所帮助(因此它不应该是我自己的路径)

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

当R CMD检查(或稍后用户)运行该示例时,您需要提供该文件的完整路径!您可以使用system.filepath.package命令轻松构建该路径。 如果您的包名为foo,则以下操作应该可以解决问题:

    }, ex = function(){
  path = paste0(system.file(package = "foo"), "/extdata/input_data")
  m1 = test(path,"A")
  })

您可能希望在某处独立添加file.path命令。

因为read.csv只是read.table的包装器,所以我不希望w.r.t有任何根本的区别。读取压缩文件。

注释:R在构建系统目录时删除目录的“inst /”部分。这个thread讨论了inst目录

答案 1 :(得分:0)

我想你可能只想和read.table一起去......无论如何都要尝试一下。

    fopen <- file(paste0(path,"/file_",letter,".tsv.gz"),open="rt")
    data <- read.table(fopen,sep="\t",header=F,quote="\"",stringsAsFactors=F)

细化:

在一天结束时,我认为您的问题主要是因为您使用read.csv而不是read.table,它可以直接打开.gz压缩文件。所以只是为了确定。这是我做的一个小实验。

实验:

# zip up a .csv file (in this case example_A.csv) that exists in my working directory into .gz format

    system("gzip example_A.csv")

# just wanted to pass the path as a variable like you did

    path <- getwd()

    file <- paste0(path, "/example_", "A", ".csv.gz")
    data <- read.table(file, sep=",", header=FALSE, stringsAsFactors=FALSE) # I think 
               # these are the only options you need. 
               # stringsAsFactors=FALSE is agood one.

    data <- data[1:5,1:7] # a subset of the data

  V1       V2     V3      V4     V5      V6     V7
1 id Scenario Region    Fuel  X2005   X2010  X2015
2  1 BSE9VOG4     R1 Biomass      0  2.2986 0.8306
3  2 BSE9VOG4     R1    Coal 7.4339 13.3548 9.2918
4  3 BSE9VOG4     R1     Gas 1.9918  2.4623 2.5558
5  4 BSE9VOG4     R1     LFG 0.2111  0.2111 0.2111

在一天结束时(我说的太多了)你可以确定问题出在你用来读取压缩文件的方法或你为文件名构建的文本字符串上(避风港)不看后者。无论如何运气好的包装。我希望它会变成潮流。