我正在使用 Rscript 从某个目录中的给定 CSV 文件中绘制一些数字,这不一定是我当前的工作目录。我可以这样称呼它:
./script.r ../some_directory/inputfile.csv
现在我想在同一个目录(../some_directory)中输出我的数字,但我不知道该怎么做。我试图获取输入文件的绝对路径,因为我可以从中构造输出路径,但我不知道如何做到这一点。
我正在使用 Rscript 从某个目录中的给定 CSV 文件中绘制一些数字,这不一定是我当前的工作目录。我可以这样称呼它:
./script.r ../some_directory/inputfile.csv
现在我想在同一个目录(../some_directory)中输出我的数字,但我不知道该怎么做。我试图获取输入文件的绝对路径,因为我可以从中构造输出路径,但我不知道如何做到这一点。
normalizePath() #Converts file paths to canonical user-understandable form
或者
library(tools)
file_path_as_absolute()
这个问题很老了,但它仍然错过了一个可行的解决方案。所以这是我的答案:
使用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
这里的解决方案:
args = commandArgs(TRUE)
results_file = args[1]
output_path = dirname(normalizePath(results_file))
从文件中获取绝对路径
为什么不将基本 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"
我看到人们给出了解决方案的一部分,但不是全部。我用过这个:
outputFile = paste(normalizePath(dirname(inputFile)),"\\", "my_file.ext", sep = "")
希望能帮助到你。