Ответ 1
normalizePath() #Converts file paths to canonical user-understandable form
или
library(tools)
file_path_as_absolute()
Я использую 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
используется, чтобы иметь переносимый 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
Здесь решение:
args = commandArgs(TRUE)
results_file = args[1]
output_path = dirname(normalizePath(results_file))
Я вижу, что люди давали куски решения, но не все. Я использовал это:
outputFile = paste(normalizePath(dirname(inputFile)),"\\", "my_file.ext", sep = "")
Надеюсь, что это поможет.
Почему бы не объединить базовую функцию 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"