यदि कोई चाहता है, तो यह मेरा स्वयं का फ़ंक्शन path.cat
है। इसकी कार्यक्षमता अतिरिक्त चीनी के साथ पाइथन के os.path.join
के साथ तुलनीय है, यह ..
का अर्थ है।
इस फ़ंक्शन के साथ, आप पदानुक्रमित पथ बना सकते हैं, लेकिन file.path
के विपरीत, आप उपयोगकर्ता को पूर्ण पथ डालकर पदानुक्रम को ओवरराइड करने की क्षमता छोड़ देते हैं। और एक अतिरिक्त चीनी के रूप में, वह स्पष्ट अर्थ के साथ ".." जहां भी वह पथ में पसंद करता है डाल सकता है।
उदा।
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
समारोह केवल पथ विभाजक है, जो ठीक है, के बाद से आर पारदर्शी रूप से Windows मशीन पर बैकस्लैश करने के लिए उन्हें तब्दील हो के रूप में स्लैश के साथ काम करता है।
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]))
}
स्रोत
2014-01-23 16:00:18
ग्रेट उत्तर। लेकिन, फ़ंक्शन पिछला "/" का ख्याल नहीं रखता है, इसलिए 'file.path ("/ home/user /", "project")' अमान्य '/ home/user // project' में परिणाम। क्या कोई और कार्य है, या मुझे इसे स्वयं करना चाहिए (हालांकि, हालांकि)? –
यदि आप खाली स्ट्रिंग से शुरू करते हैं तो आपको यह मिलता है: 'file.path ("", "home", "user", "project") ''/home/user/project "' –
बताता है कि '/ home/उपयोगकर्ता // प्रोजेक्ट' और '/ home/user/project' दोनों यूनिक्स पर मान्य हैं। आप किस ओएस पर हैं? – flodel