2010-02-28 9 views
14

यहाँ एक समारोह मैं लाइनों में एक लंबी स्ट्रिंग एक दिया लंबाईसम्मिलित पंक्ति विराम - शब्द लपेटो

strBreakInLines <- function(s, breakAt=90, prepend="") { 
    words <- unlist(strsplit(s, " ")) 
    if (length(words)<2) return(s) 
    wordLen <- unlist(Map(nchar, words)) 
    lineLen <- wordLen[1] 
    res <- words[1] 
    lineBreak <- paste("\n", prepend, sep="") 
    for (i in 2:length(words)) { 
    lineLen <- lineLen+wordLen[i] 
    if (lineLen < breakAt) 
     res <- paste(res, words[i], sep=" ") 
    else { 
     res <- paste(res, words[i], sep=lineBreak) 
     lineLen <- 0 
    } 
    } 
    return(res) 
} 

यह समस्या मैं था के लिए काम करता है से अधिक समय नहीं तोड़ने के लिए लिखा है, लेकिन मुझे आश्चर्य है कि मैं यहां कुछ सीख सकता हूं। क्या कोई छोटा या अधिक कुशल समाधान है, खासकर मैं लूप के लिए छुटकारा पा सकता हूं?

उत्तर

35

कैसे इस बारे में:

gsub('(.{1,90})(\\s|$)', '\\1\n', s) 

यह अधिकतम 90 वर्ण के साथ लाइनों में स्ट्रिंग टूट जाएगा "एस" (लाइन ब्रेक चरित्र को छोड़कर "\ n", लेकिन क्या अंतर शब्द रिक्त स्थानों सहित), जब तक कि वहाँ है एक शब्द स्वयं 90 वर्णों से अधिक है, तो वह शब्द स्वयं पूरी लाइन पर कब्जा कर लेगा।

वैसे, अपने कार्य टूट लगता है --- आप

lineLen <- 0 

साथ

lineLen <- wordLen[i] 
+0

ग्रेट सॉल्यूशन! मुझे लगता है कि मुझे नियमित अभिव्यक्तियों के बारे में जानने की ज़रूरत है, मेरे कार्य में गलती को इंगित करने के लिए भी धन्यवाद। –

+0

क्या आप एक नोट जोड़ सकते हैं जो बताता है कि प्रत्येक भाग विशेष रूप से क्या करता है? – theforestecologist

3

आपको कम से उदा देख सकते हैं बदलना चाहिए write.dcf() आर में स्वयं ही कार्य; यह एक लूप का भी उपयोग करता है, इसलिए यहां शर्मिंदा होने के लिए कुछ भी नहीं है।

पहला लक्ष्य यह सही है - चैंबर (2008) देखें।

+2

write.dcf (और फिर प्रारूप डीएल) का निरीक्षण करना फ़ंक्शन स्ट्रॉप लाया जो वास्तव में मेरा कार्य करने की कोशिश करता है। –

+0

बिल्कुल सही - मुझे पता था कि कुछ था लेकिन मुझे तुरंत यह नहीं मिला। मुझे इसे एक बार क्रैनबेरी के लिए भी चाहिए ... –

15

पूर्णता के लिए, strwrap पर कर्स्टन डब्ल्यू की टिप्पणी अंक, सबसे आसान कार्य है जो याद करने के लिए:

strwrap("Lorem ipsum... you know the routine", width=10) 

और वास्तव में समाधान प्रश्न में प्रस्तावित मैच के लिए, स्ट्रिंग के लिए है बाद में चिपकाया जा:

paste(strwrap(s,90), collapse="\n") 

इस पोस्ट में जान-बूझकर समुदाय विकी किया जाता है के बाद से समारोह को खोजने का सम्मान मेरा नहीं है।

+0

यदि आपको इसे फ़ंक्शन के रूप में चाहिए, तो आप निम्न उपयोगकर्ता परिभाषित सूत्र के लिए 'sapply' में 'strwrap' को भी संशोधित कर सकते हैं: ' trimmer <- function (x, break_limit) { sapply (strwrap (x, break_limit, सरलीकृत = गलत), पेस्ट, पतन = "\ n") } ' –

6

आगे पूर्णता के लिए, वहाँ है:

  • stringi::stri_wrap
  • stringr::str_wrap (जो सिर्फ अंत में कहता है stringi::stri_wrap

stringi संस्करण चरित्र के साथ सौदा होगा बेहतर सेट (यह ICU लाइब्रेरी पर बनाया गया है) और यह सी/सी ++ में है, इसलिए यह अंततः base::strwrap से तेज होगा। यह str पैरामीटर पर भी सदिश है।

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