R स्क्रिप्ट में कई लाइनों पर विभाजित कोड


137

मैं एक आर स्क्रिप्ट को कई लाइनों में विभाजित करना चाहता हूं (क्योंकि यह बहुत लंबा है)। मैं उसको कैसे करू?

विशेष रूप से, मेरे पास एक पंक्ति है जैसे कि

setwd('~/a/very/long/path/here/that/goes/beyond/80/characters/and/then/some/more')

क्या कई मार्गों पर लंबे पथ को विभाजित करना संभव है? मैंने कोशिश की

setwd('~/a/very/long/path/here/that/goes/beyond/80/characters/and/
then/some/more')

returnपहली पंक्ति के अंत में कुंजी के साथ ; लेकिन वह काम नहीं करता है।

धन्यवाद।

जवाबों:


107

आप कई लाइनों पर कोड नहीं तोड़ रहे हैं , बल्कि एक पहचानकर्ता हैं । इसमे अंतर है।

अपने मुद्दे के लिए, प्रयास करें

R> setwd(paste("~/a/very/long/path/here",
               "/and/then/some/more",
               "/and/then/some/more",
               "/and/then/some/more", sep=""))

जो यह भी दर्शाता है कि कई लाइनों में कोड को तोड़ना पूरी तरह से ठीक है।


13
धन्यवाद! मैं सोच रहा था कि क्या कोई ऐसा चरित्र है जो मैं आर को इंगित करने के लिए लाइन के अंत में रख सकता हूं कि कोड अगली पंक्ति पर जारी है। जैसे पायथन में "\"। हालाँकि, स्ट्रिंग निरंतरता की विशिष्ट समस्या के लिए आपका समाधान अच्छी तरह से काम करता है।
जिज्ञासु २

14
या आप बेहतर पेस्ट 0 (...) का उपयोग करते हैं जो पेस्ट के बराबर है (..., sep = "")
gkcn

31
लेकिन paste0अभी तक मौजूद नहीं था जब मैंने 2+ साल पहले उत्तर लिखा था।
डिर्क एडल्डबुलेटेल

ऐसा लगता है कि संपादन अस्वीकार कर दिया गया था, और मैं कमोबेश अस्वीकार से सहमत हूं। जवाब अभी भी सही है, इसका संदर्भ है और टिप्पणियां इसे अपडेट करती हैं।
डर्क एडल्डबुलेटेल

इसके लिए धन्यवाद। मैंने गुमराह किया कि आपको लंबी लाइनों को विभाजित करने के लिए प्लस का उपयोग करने की आवश्यकता है। मुझे खुशी है कि वास्तविकता बहुत सरल है!
इयान सैमुअल मैकलीन एल्डर

143

बाह, टिप्पणियाँ बहुत छोटी हैं। वैसे भी @ डर्क बहुत सही है।

कोड को अगली पंक्ति में शुरू होने की आवश्यकता नहीं है। यह पाइथन ;-) की तुलना में अधिक स्मार्ट है और अगली पंक्ति को तब भी पढ़ना जारी रखेगा जब तक कि यह कथन को "समाप्त नहीं" मान लेता है। दरअसल, आपके मामले में यह अगली पंक्ति में भी चला गया, लेकिन आर एक चरित्र के रूप में वापसी लेता है जब इसे "" के बीच रखा जाता है।

ध्यान रहे, आपको यह सुनिश्चित करना होगा कि आपका कोड समाप्त नहीं हुआ है। तुलना

a <- 1 + 2
+ 3

साथ में

a <- 1 + 2 +
3

इसलिए, जब कई लाइनों पर कोड फैल रहा है, तो आपको यह सुनिश्चित करना होगा कि R कुछ जानता है कि या तो आने वाला है:

  • एक ब्रैकेट खुला छोड़कर, या
  • ऑपरेटर के साथ लाइन समाप्त करना

जब हम स्ट्रिंग्स की बात कर रहे हैं, तब भी यह काम करता है लेकिन आपको थोड़ा सावधान रहने की जरूरत है। आप उद्धरण चिह्नों को खोल सकते हैं और जब तक आप इसे बंद नहीं करेंगे तब तक आर पढ़ेगा। लेकिन न्यूलाइन सहित हर चरित्र को स्ट्रिंग के भाग के रूप में देखा जाएगा:

x <- "This is a very
long string over two lines."
x
## [1] "This is a very\nlong string over two lines."
cat(x)
## This is a very
## long string over two lines.

यही कारण है कि इस मामले में, आपके कोड ने काम नहीं किया: एक पथ में एक नया वर्ण ( \n) नहीं हो सकता । तो इसीलिए आप प्रस्तावित paste()या paste0()डिर्क के साथ समाधान का बेहतर उपयोग करते हैं ।


धन्यवाद जोरिस मैंने कुछ ऑनलाइन दस्तावेज़ में आपके द्वारा दिए गए उदाहरणों के समान उदाहरण देखे और कोशिश की कि स्ट्रिंग के लिए भी। मैंने सोचा था कि यदि यह एक समापन उद्धरण का सामना नहीं करता है, तो यह अगली पंक्ति तक जारी रहेगा। लेकिन स्ट्रिंग के साथ यह काम नहीं करता है, या बल्कि, जैसा कि आपने कहा था, इस अर्थ में एक अलग तरीके से काम करता है कि यह एक नई पंक्ति चरित्र के रूप में प्रवेश करता है।
जिज्ञासु २

यह स्पष्ट करने के लिए धन्यवाद कि कभी-कभी आप प्लस चिह्न के साथ लाइनें क्यों विभाजित कर सकते हैं!
इयान सैमुअल मैकलीन एल्डर

8
नहीं, यह यहाँ अजगर से ज्यादा स्मार्ट नहीं है। बल्कि paste("~one",\n"/two")आपको सिर्फ जरूरत है ("~one" \n "/two")। अल्पविराम और ए paste। भाषा की कमी नहीं दिख रही है। मैं दोनों भाषाओं का उपयोग करता हूं, लेकिन हमेशा ऐसा होता है कि पेस्ट एक झुंझलाहट थी।
फिल कूपर

2
@JorisMeys राइट, मैं उस गलत बयान को सही करने की कोशिश कर रहा था। Parens का उपयोग करें और आपको लाइन निरंतरता के लिए "\" की आवश्यकता नहीं है। मुझे यह पसंद है क्योंकि आप उन पंक्तियों पर भी टिप्पणी कर सकते हैं जो आप "\" वाक्य रचना के साथ नहीं कर सकते ( ("one"\n "/one.one" # some comment\n "/two")' उदाहरण के लिए stackoverflow.com/questions/10660435/…
फिल कूपर

1
leaving a bracket open, or ending the line with an operatorये दोनों जाने का रास्ता हैं।
SIslam

35

ऊपर दिए गए डिर्क की विधि पूरी तरह से काम करेगी, लेकिन यदि आप एक लंबी स्ट्रिंग लाने के लिए रास्ता तलाश रहे हैं, जहां व्हॉट्सएप / संरचना को संरक्षित करना महत्वपूर्ण है (उदाहरण: RODBC का उपयोग करके एक SQL क्वेरी) एक दो कदम समाधान है।

1) कई लाइनों में पाठ स्ट्रिंग लाओ

long_string <- "this
is 
a 
long
string
with
whitespace"

2) आर \nवर्णों का एक गुच्छा पेश करेगा । प्रलेखन केstrwrap() अनुसार, व्हॉट्सएप को नष्ट करने वाले लोगों को बाहर निकालें :

strwrap(long_string, width=10000, simplify=TRUE)

अपने पाठ को एक बहुत, बहुत लंबी पंक्ति में लपेटने के लिए स्ट्रैपैप कहने से, आपको एक एकल वर्ण वेक्टर मिलता है जिसमें कोई व्हाट्सएप / अन्य वर्ण नहीं होता है।


3
मुझे यह जवाब सबसे अधिक पसंद है क्योंकि मुझे पेस्ट के साथ इतने कॉमा लिखने की ज़रूरत नहीं है, अगर स्ट्रिंग लंबी है। +1
user3032689

3
ध्यान रखें कि strwrapस्रोत स्ट्रिंग 10k वर्णों से अधिक नहीं होने पर भी कई तारों के वेक्टर को लौटा सकता है। कोशिश करो strwrap("a\n\nb")। यह लंबाई 3 के वेक्टर को लौटाएगा और आपको paste(strwrap("a\n\nb"), collapse=" ")वेक्टर को ढहाने के लिए स्पेस कैरेक्टर ग्लू का उपयोग करके इसे वापस चिपकाने की आवश्यकता है ।
गेद्रोक्स

17

उस विशेष मामले के लिए है file.path:

File <- file.path("~", 
  "a", 
  "very", 
  "long",
  "path",
  "here",
  "that",
  "goes",
  "beyond",
  "80",
  "characters",
  "and",
  "then",
  "some",
  "more")
setwd(File)

0

मुझे पता है कि यह पोस्ट पुरानी है, लेकिन मेरे पास इस तरह की स्थिति थी और मैं अपना समाधान साझा करना चाहता हूं। उपरोक्त सभी उत्तर ठीक काम करते हैं। लेकिन अगर आपके पास एक कोड है जैसे कि डेटाटेबल सिन्टैक्स में उन लोगों के लिए यह चुनौतीपूर्ण हो जाता है। उदाहरण के लिए मुझे इस तरह की समस्या थी।

mass <- files[, Veg:=tstrsplit(files$file, "/")[1:4][[1]]][, Rain:=tstrsplit(files$file, "/")[1:4][[2]]][, Roughness:=tstrsplit(files$file, "/")[1:4][[3]]][, Geom:=tstrsplit(files$file, "/")[1:4][[4]]][time_ [एस]<=12000]

मैंने ऊपर दिए गए अधिकांश सुझावों की कोशिश की और उन्होंने काम नहीं किया। लेकिन मुझे लगा कि वे कॉमा के भीतर विभाजित हो सकते हैं []][काम पर विभाजन नहीं है।

mass <- files[, Veg:=tstrsplit(files$file, "/")[1:4][[1]]][, 
    Rain:=tstrsplit(files$file, "/")[1:4][[2]]][, 
    Roughness:=tstrsplit(files$file, "/")[1:4][[3]]][, 
    Geom:=tstrsplit(files$file, "/")[1:4][[4]]][`time_[s]`<=12000]

क्या आप उस सवाल को मिला सकते हैं जिसका आप जवाब देने की कोशिश कर रहे थे? इससे ओपी के सवाल का कोई लेना देना नहीं है।
zerweck

यह करता है। मुख्य प्रश्न यह है कि कोड की एक पंक्ति को कई लाइनों में कैसे विभाजित किया जाए। मैंने दिखाया कि मूल प्रश्न की तुलना में अधिक जटिल है जो एक और उदाहरण का उपयोग करके। मुझे लगा कि इसे पोस्ट करना आवश्यक है क्योंकि मैंने बहुत समय बिताने की कोशिश की थी कि उस विशेष कोड के टुकड़े को कैसे विभाजित किया जाए। और मुझे लगता है कि यह इसी तरह की समस्या के साथ किसी की मदद करता है।
एम टेरी

ओपी की समस्या यह थी कि एक वर्ण वेक्टर को एक लाइनब्रेक के साथ विभाजित करना चरित्र वेक्टर में लाइनब्रेक शामिल करता है। आपका जवाब केवल डेटा के लिए विशिष्ट है। सिंटेक्स
जेरवेक्स

कई लाइनों पर कोड की एक पंक्ति को विभाजित करने के एक उदाहरण के रूप में
एम टेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.