Полное имя файла в 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 в некоторых проверенных папках.