42

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

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

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

4

5 回答 5

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

或者

library(tools)
file_path_as_absolute()
于 2012-11-09T15:51:29.107 回答
9

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

使用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用于拥有可移植操作系统的代码。(这里
  • file.sep给出“在您的平台上使用的文件分隔符:“/”在 Unix-likes 和 Windows 上(但不是在以前的经典 Mac OS 端口上)。(这里

警告:如果不小心使用,这可能会导致一些问题。例如,假设这是路径: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
于 2018-03-16T13:44:06.240 回答
5

这里的解决方案:

args = commandArgs(TRUE)

results_file = args[1]

output_path = dirname(normalizePath(results_file))
于 2012-11-09T15:54:49.913 回答
1

从文件中获取绝对路径

为什么不将基本 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"
于 2019-07-05T13:18:50.760 回答
1

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

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

希望能帮助到你。

于 2015-09-22T12:11:44.113 回答