【问题标题】:How do I get the absolute path of an input file in R如何在 R 中获取输入文件的绝对路径
【发布时间】:2012-11-09 15:42:57
【问题描述】:

我正在使用 Rscript 从某个目录中的给定 CSV 文件中绘制一些数字,这不一定是我当前的工作目录。我可以这样称呼它:

./script.r ../some_directory/inputfile.csv

现在我想在同一个目录(../some_directory)中输出我的数字,但我不知道该怎么做。我试图获取输入文件的绝对路径,因为我可以从中构造输出路径,但我不知道如何做到这一点。

【问题讨论】:

    标签: r


    【解决方案1】:
    normalizePath() #Converts file paths to canonical user-understandable form
    

    library(tools)
    file_path_as_absolute()
    

    【讨论】:

    • normalizePath(".")file_path_as_absolute(".") 在 R 3.2.3 上仍然为我工作。
    • @Greg 你能列出你发现这在哪个版本的 R 上不起作用吗?我即将把它集成到我的程序中,提前知道会很有帮助,谢谢。
    • @user5359531 好问题。我不完全确定,但我认为我使用的是 R 3.2.3,但我没有尝试使用 MattBagg 的更新
    • normalizePath() 是基础 R 的一部分,在您的代码库中使用应该是安全的。
    【解决方案2】:

    这个问题已经很老了,但它仍然错过了一个可行的解决方案。所以这是我的答案:

    使用normalizePath(dirname(f))。 下面的例子列出了当前目录下的所有文件和目录。

    dir <- "."
    allFiles <- list.files(dir)
    for(f in allFiles){
      print(paste(normalizePath(dirname(f)), fsep = .Platform$file.sep, f, sep = "")) 
    }
    

    地点:

    • normalizePath(dirname(f)) 给出父目录的绝对路径。因此,应将各个文件名添加到路径中。
    • .Platform 用于拥有可移植操作系统的代码。 (here)
    • file.sep 给出“在您的平台上使用的文件分隔符:“/”在类 Unix 和 Windows 上(但不是在以前的经典 Mac OS 端口上)。 (here)

    警告:如果不小心使用,可能会导致一些问题。例如,假设这是路径:A/B/a_file,工作目录现在设置为B。然后是下面的代码:

    dir <- "B"
    allFiles <- list.files(dir)
    for(f in allFiles){
      print(paste(normalizePath(dirname(f)), fsep = .Platform$file.sep, f, sep = "")) 
    }
    

    会给:

    > A/a_file
    

    但是,它应该是:

    > A/B/a_file
    

    【讨论】:

      【解决方案3】:

      解决办法:

      args = commandArgs(TRUE)
      
      results_file = args[1]
      
      output_path = dirname(normalizePath(results_file))
      

      【讨论】:

      • 看来dirname() 只给出了减去当前文件夹的路径。有没有类似的东西可以给出完整的路径?
      【解决方案4】:

      我看到人们给出了部分解决方案,但不是全部。 我用过这个:

      outputFile = paste(normalizePath(dirname(inputFile)),"\\", "my_file.ext", sep = "")
      

      希望对你有帮助。

      【讨论】:

        【解决方案5】:

        从文件中获取绝对路径

        为什么不将基本 R 函数 file.path() 与 @Marius 给出的答案结合起来。这看起来稍微简单一些,可以使用文件向量 (files),并注意系统特定的分隔符:

        file.path(normalizePath(dirname(files)), files)
        

        并包裹在一个函数中(abspath):

        abspath &lt;- function(files)file.path(normalizePath(dirname(files)), files)

        例如:

        > setwd("~/test")
        > list.files()
        [1] "file1.txt" "file2.txt"
        

        然后:

        > abspath(files)
        [1] "/home/myself/test/file1.txt" "/home/myself/test/file2.txt"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          • 2021-04-30
          • 2012-04-24
          • 2010-09-18
          相关资源
          最近更新 更多