【问题标题】:Package compilation and relative path包编译和相对路径
【发布时间】:2014-09-19 16:50:30
【问题描述】:

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

这是一个极简主义的例子: 我的函数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 文件夹中,因为文件太多。有没有办法编译包并在函数示例中设置包所在的相对工作目录?这在分发包时也会很有帮助(因此它不应该是我自己的路径)

非常感谢您的帮助。

【问题讨论】:

    标签: r path package


    【解决方案1】:

    当 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目录

    【讨论】:

    • 你得到了我的问题,但你的建议仍然没有成功。我尝试将system.file(package ="ABCDpackage")file.path("ABCDpackage) 附加到路径中。我得到这个错误。 no suWarning in file(file, "rt") : cannot open file 'C:/Users/yuhu/AppData/Local/Temp/RtmpmwJifB/RLIBS_10dc69546c57/ABCDpackage/inst/extdata/input_data/file_A.tsv.gz': No such file or directory Error in file(file, "rt") : cannot open the connection Calls: MedalMatch -> read.csv -> read.table -> file Execution halted Error: Command failed (1)
    • 这很奇怪。进行 R CMD 检查时,系统将包保存在临时目录中(尝试构建它并检查数据时)。但是在检查示例时,system.file 仍然可以找到包目录,但不知何故它已经被删除了
    • 现在可以了。我需要取出inst/,即path = paste0(system.file(package = "foo"), "/extdata/input_data"),而不是path = paste0(system.file(package = "foo"), "/inst/extdata/input_data")
    【解决方案2】:

    我认为您可能只想使用 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

    归根结底(我说的太多了),您可以确定问题出在您用于读取压缩文件的方法或您为文件名构建的文本字符串(避风港'没有调查后者)。无论如何,祝你好运。我希望它扭转潮流。

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 1970-01-01
      • 2013-09-05
      • 2014-03-30
      • 1970-01-01
      • 2012-10-17
      • 2010-09-15
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多