Полное имя файла в R
Я хочу получить полное имя файла в R, учитывая любые стандартные обозначения. Например:
- .доб
- файл~/.ext (этот случай может быть обработан
path.expand
) - ../ current_dir / file.доб
- etc.
под полным именем файла я имею в виду, например, (в Unix-подобной системе):
/ главная / пользователь / некоторые / путь / файл.доб
(редактировать - использовать файл.путь и попытка поддержки Windows) грубая реализация может быть:
path.qualify <- function(path) {
path <- path.expand(path)
if(!grepl("^/|([A-Z|a-z]:)", path)) path <- file.path(getwd(),path)
path
}
тем не менее, я бы идеально хотел что-то кросс-платформенное, которое может обрабатывать относительные пути с ../
, символические ссылки и т. д. Решение только для R было бы предпочтительнее (а не сценарии оболочки или аналогичные), но я не могу найти простой способ сделать это, не кодируя его "с нуля".
любой идеи?
2 ответов
Я думаю, вы хотите normalizePath()
:
> setwd("~/tmp/bar")
> normalizePath("../tmp.R")
[1] "/home/gavin/tmp/tmp.R"
> normalizePath("~/tmp/tmp.R")
[1] "/home/gavin/tmp/tmp.R"
> normalizePath("./foo.R")
[1] "/home/gavin/tmp/bar/foo.R"
для Windows, есть аргумент winslash
который вы, возможно, захотите установить все время, поскольку он игнорируется на чем-либо, кроме Windows, поэтому не повлияет на другие ОС:
> normalizePath("./foo.R", winslash="\")
[1] "/home/gavin/tmp/bar/foo.R"
(вам нужно избежать \
отсюда \
) или
> normalizePath("./foo.R", winslash="/")
[1] "/home/gavin/tmp/bar/foo.R"
в зависимости от того, как вы хотите, чтобы путь представлен б/у. Первый является значением по умолчанию ("\"
) так что вы можете придерживаться этого, если этого достаточно, без необходимости устанавливать ничего явно.
на R 2.13.0 тогда "~/file.ext"
бит тоже работает (см. комментарии):
> normalizePath("~/foo.R")
[1] "/home/gavin/foo.R"
Я думаю, что я вроде как упускаю суть вашего вопроса, но, надеюсь, мой ответ может указать вам в нужном направлении (он интегрирует вашу идею использования paste
и getwd
С list.files
):
paste(getwd(),substr(list.files(full.names = TRUE), 2,1000), sep ="")
Edit: работает в windows в некоторых проверенных папках.