Подтвердить что ты не робот

Как получить абсолютный путь входного файла в R

Я использую Rscript для построения некоторых цифр из данного CSV файла в какой-то директории, что не обязательно является моей текущей рабочей папкой. Я могу назвать это следующим образом:

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

Теперь я хочу выводить свои цифры в том же каталоге (../some_directory), но я понятия не имею, как это сделать. Я попытался получить абсолютный путь для входного файла, потому что из этого я мог бы построить выходной путь, но я не мог узнать, как это сделать.

4b9b3361

Ответ 1

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

или

library(tools)
file_path_as_absolute()

Ответ 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 используется, чтобы иметь переносимый OS-код. (здесь)
  • file.sep дает "разделитель файлов, используемый на вашей платформе:"/"как в Unix-подобных системах, так и в Windows (но не на прежнем порту для Classic 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

Ответ 3

Здесь решение:

args = commandArgs(TRUE)

results_file = args[1]

output_path = dirname(normalizePath(results_file))

Ответ 4

Я вижу, что люди давали куски решения, но не все. Я использовал это:

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

Надеюсь, что это поможет.

Ответ 5

Почему бы не объединить базовую функцию 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"