Gibt es eine Funktion zum Verketten von Pfaden?
Ich weiß, dass es nicht so schwierig zu implementieren ist, aber trotzdem ... abgesehen davon, dass ich mich um das Nachlaufen /
(oder \
) kümmere, müsste ich mich um die ordnungsgemäße Erkennung des Betriebssystempfadformats kümmern (dh ob wir schreiben C:\dir\file
oder /dir/file
).
Wie gesagt, ich glaube zu wissen, wie man es umsetzt; Die Frage ist: soll ich es tun? Ist die Funktionalität bereits in einem vorhandenen R-Paket vorhanden?
r
path
concatenation
Adam Ryczkowski
quelle
quelle
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)?file.path("", "home", "user", "project")
Erzeugt"/home/user/project"
/home/user//project
und/home/user/project
beide unter Unix gültig sind. Auf welchem Betriebssystem bist du?do.call(file.path, yourlist)
Falls jemand möchte, ist dies meine eigene Funktion
path.cat
. Seine Funktionalität ist vergleichbar mit der von Pythonos.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") # After writing this function I've learned, that iterators are very inefficient in R. library("itertools") #High-level function that inteligentely concatenates paths given in arguments #The user interface is the same as for file.path, with the exception that it understands the path ".." #and it can identify relative and absolute paths. #Absolute paths starts comply with "^\/" or "^\d:\/" regexp. #The concatenation starts from the last absolute path in arguments, or the first, if no absolute paths are given. 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) { #nothing } else { out[i]<-item i<-i+1 } } do.call(file.path,as.list(out[1:i-1])) }
quelle
normalizePath()
Der Pfad muss tatsächlich auf dem R-Server vorhanden sein. Dies ist möglicherweise nicht immer erwünscht. Für mich ist es ein wichtiger Unterschied. Laut OTOH-Handbuch werdennormalizePath()
kurze Namen unter Windows in lange konvertiert.