2011-04-19 23 views
8

Chciałbym uzyskać pełną nazwę pliku w R, biorąc pod uwagę standardowe zapisy. NpW pełni kwalifikowana nazwa pliku w R

  • plik.roz
  • ~/plik.roz (w tym przypadku mogą być obsługiwane przez path.expand)
  • ../current_dir/file.ext
  • itp

Poprzez pełną nazwę pliku mam na myśli, na przykład, (w systemie Unix-like):

/home/user/some/path/file.ext

(red - stosowanie file.path i próba wsparcia Windows) Surowy realizacja może być:

path.qualify <- function(path) { 
    path <- path.expand(path) 
    if(!grepl("^/|([A-Z|a-z]:)", path)) path <- file.path(getwd(),path) 
    path 
} 

Jednak ja Idealnie lubię coś międzyplatformowego, które może obsługiwać względne ścieżki z ../, dowiązaniami symbolicznymi itp. Preferowane byłoby rozwiązanie tylko R (zamiast skryptów powłoki lub podobnych), ale nie mogę znaleźć żadnego prostego sposobu robienia tego, kodowania go "od zera".

Wszelkie pomysły?

Odpowiedz

10

myślę chcesz 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" 

dla Windows, nie jest argumentem winslash co może chcesz ustawić cały czas, ponieważ jest ignorowany na coś innego niż Windows, więc nie wpłynie innymi systemami operacyjnymi:

> normalizePath("./foo.R", winslash="\\") 
[1] "/home/gavin/tmp/bar/foo.R" 

(Musisz uciec \ stąd \\) lub

> normalizePath("./foo.R", winslash="/") 
[1] "/home/gavin/tmp/bar/foo.R" 

w zależności od tego, w jaki sposób chcesz prezentować/używać ścieżki. Ta pierwsza jest domyślna ("\\"), więc możesz trzymać się jej, jeśli wystarczy, bez potrzeby ustawiania niczego jawnie.

na R 2.13.0 wtedy "~/file.ext" bit działa również (patrz komentarze):

> normalizePath("~/foo.R") 
[1] "/home/gavin/foo.R" 
+0

Doskonale, nawet odsyła do dowiązań symbolicznych - tylko problem, który nie obejmuje przypadku '~/file.ext'. Łatwo rozliczane za pomocą 'normalizePath (path.expand (filename))'. Wielkie dzięki. – daveslanted

+0

@daveslanted Robi to w wersji 2.13.0. Zobacz moją zaktualizowaną odpowiedź. Jaką wersję R masz na koncie? –

+0

R 2.12.2. Prawdopodobnie będę musiał trzymać się obejścia zamiast ulepszać, ale dobrze wiedzieć, że został naprawiony w najnowszej stabilnej wersji. Dzięki jeszcze raz. – daveslanted

2

Chyba trochę mija się z celem na swoje pytanie, ale mam nadzieję, że moja odpowiedź może wskazać w żądanym kierunku (integruje swój pomysł wykorzystania paste i getwd z list.files):

paste(getwd(),substr(list.files(full.names = TRUE), 2,1000), sep ="") 

Edycja: Działa w oknach w niektórych testowanych folderach.

+0

Dzięki za odpowiedź, ale idealnie jestem po funkcji, która zajmuje dowolną nazwę pliku jako argument (np jak na liście punktorów w pytaniu) i zwraca pełną nazwę pliku. – daveslanted

+0

Jak to działa, jeśli użytkownik chce przekazać w ścieżce '" ../ current_dir/file.ext "' jako ścieżkę do rozwinięcia? –

Powiązane problemy