Falls jemand möchte, ist dies meine eigene Funktion path.cat
. Seine Funktionalität ist vergleichbar mit der von Python os.path.join
mit dem zusätzlichen Zucker, den es interpretiert ..
.
Mit dieser Funktion können Sie Pfade hierarchisch erstellen, jedoch im Gegensatz zu file.path
können Sie dem Benutzer die Möglichkeit geben, die Hierarchie zu überschreiben, indem Sie einen absoluten Pfad eingeben. Und als Zuckerzusatz kann er das ".." mit offensichtlicher Bedeutung in den Pfad setzen, wo immer er möchte.
z.B
path.cat("/home/user1","project/data","../data2")
yelds /home/user1/project/data2
path.cat("/home/user1","project/data","/home/user2/data")
yelds /home/user2/data
Die Funktion funktioniert nur mit Schrägstrichen als Pfadtrennzeichen, was in Ordnung ist, da R sie transparent in Backslashes auf Windows-Computern übersetzt.
library("iterators")
library("itertools")
path.cat<-function(...)
{
elems<-list(...)
elems<-as.character(elems)
elems<-elems[elems!='' && !is.null(elems)]
relems<-rev(elems)
starts<-grep('^[/\\]',relems)[1]
if (!is.na(starts) && !is.null(starts))
{
relems<-relems[1:starts]
}
starts<-grep(':',relems,fixed=TRUE)
if (length(starts)==0){
starts=length(elems)-length(relems)+1
}else{
starts=length(elems)-starts[[1]]+1}
elems<-elems[starts:length(elems)]
path<-do.call(file.path,as.list(elems))
elems<-strsplit(path,'[/\\]',FALSE)[[1]]
it<-ihasNext(iter(elems))
out<-rep(NA,length(elems))
i<-1
while(hasNext(it))
{
item<-nextElem(it)
if(item=='..')
{
i<-i-1
} else if (item=='' & i!=1) {
} else {
out[i]<-item
i<-i+1
}
}
do.call(file.path,as.list(out[1:i-1]))
}
file.path("/home/user/","project")
zu einer Ungültigkeit führt/home/user//project
. Gibt es eine andere Funktion oder sollte ich sie selbst machen (allerdings trivial)?