2012-10-28 26 views
43

क्या पथ को संयोजित करने के लिए कोई मौजूदा कार्य है?पथ को संयोजित करने के लिए फ़ंक्शन?

मैं इसे जानता हूँ कि मैं उचित ओएस पथ प्रारूप का पता लगाने की देखभाल करने की आवश्यकता होगी अभी भी उस लागू करना मुश्किल है, लेकिन नहीं है ... / (या \) अनुगामी की देखभाल करने के अलावा (यानी हम लिख चाहे C:\dir\file या /dir/file) ।

जैसा कि मैंने कहा, मुझे विश्वास है कि मुझे पता है कि इसे कैसे कार्यान्वित किया जाए; सवाल यह है: क्या मुझे यह करना चाहिए? क्या मौजूदा आर पैकेज में कार्यक्षमता पहले से मौजूद है?

उत्तर

74

हाँ, file.path()

R> file.path("usr", "local", "lib") 
[1] "usr/local/lib" 
R> 

वहाँ भी एक पैकेज में फ़ाइलों के लिए समान रूप से उपयोगी system.path() है:

R> system.file("extdata", "date_time_zonespec.csv", package="RcppBDT") 
[1] "/usr/local/lib/R/site-library/RcppBDT/extdata/date_time_zonespec.csv" 
R> 

जो

  1. जहां पर ध्यान दिए बिना फ़ाइल extdata/date_time_zonespec.csv मिल जाएगा पैकेज स्थापित है, और
  2. ओएस

जो बहुत आसान है। अन्त में, वहाँ भी

R> .Platform$file.sep 
[1] "/" 
R> 

यदि आप इसे मैन्युअल रूप से कर रही पर जोर देते है।

+1

ग्रेट उत्तर। लेकिन, फ़ंक्शन पिछला "/" का ख्याल नहीं रखता है, इसलिए 'file.path ("/ home/user /", "project")' अमान्य '/ home/user // project' में परिणाम। क्या कोई और कार्य है, या मुझे इसे स्वयं करना चाहिए (हालांकि, हालांकि)? –

+0

यदि आप खाली स्ट्रिंग से शुरू करते हैं तो आपको यह मिलता है: 'file.path ("", "home", "user", "project") ''/home/user/project "' –

+2

बताता है कि '/ home/उपयोगकर्ता // प्रोजेक्ट' और '/ home/user/project' दोनों यूनिक्स पर मान्य हैं। आप किस ओएस पर हैं? – flodel

2

यदि कोई चाहता है, तो यह मेरा स्वयं का फ़ंक्शन 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])) 
} 
+1

यह सामान्यीकृतपैथ() –

+1

कूल टिप्पणी द्वारा किया जाता है, लेकिन इसमें एक महत्वपूर्ण अंतर है: 'सामान्यizeपैथ()' को रूट सर्वर पर वास्तव में मौजूद होने की आवश्यकता होती है। यह हमेशा वांछित नहीं हो सकता है। मेरे लिए यह एक महत्वपूर्ण अंतर है। ओटीओएच मैनुअल का कहना है कि 'सामान्यizeपैथ()' छोटे नामों को विंडोज़ पर लंबे समय तक परिवर्तित करता है। –

संबंधित मुद्दे