如何获取R中输入文件的绝对路径

时间:2012-11-09 15:42:57

标签: r

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

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

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

5 个答案:

答案 0 :(得分:43)

normalizePath() #Converts file paths to canonical user-understandable form

library(tools)
file_path_as_absolute()

答案 1 :(得分:3)

这里是解决方案:

args = commandArgs(TRUE)

results_file = args[1]

output_path = dirname(normalizePath(results_file))

答案 2 :(得分:3)

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

使用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用于拥有OS可移植代码。 (here
  • file.sep给出了“在您的平台上使用的文件分隔符:”/“在Unix-alikes和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 :(得分:0)

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

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

希望它有所帮助。

答案 4 :(得分:0)

要从文件中获取绝对路径

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

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

并包装在函数(abspath)中:

abspath <- 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"