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

9o685dep  于 2023-02-01  发布在  其他
关注(0)|答案(6)|浏览(199)

我正在使用Rscript从某个目录中的CSV文件中绘制一些图形,这个目录不一定是我当前的工作目录。

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

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

a7qyws3x

a7qyws3x1#

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

library(tools)
file_path_as_absolute()
zwghvu4y

zwghvu4y2#

  • 这个问题由来已久,但仍然缺少一个可行的解决方案。因此,以下是我的答案:*

使用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系统和Windows系统上(但在以前的Classic 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
jexiocij

jexiocij3#

这里的解决方案:

args = commandArgs(TRUE)

results_file = args[1]

output_path = dirname(normalizePath(results_file))
ctrmrzij

ctrmrzij4#

    • 从文件获取绝对路径**

为什么不把R基函数file.path()和@Marius给出的答案结合起来呢?这看起来稍微简单一点,可以处理一个文件向量(files),并且可以处理系统特定的分隔符:

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

并 Package 在函数(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"
vmdwslir

vmdwslir5#

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

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

希望有帮助。

ngynwnxp

ngynwnxp6#

fs::path_abs()是最快的方法。

相关问题