একটি আর স্ক্রিপ্টে একাধিক লাইনের উপরে কোড বিভক্ত করুন


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
ধন্যবাদ! আমি ভাবছিলাম যে কোনও অক্ষর ছিল যা আমি লাইনের শেষের দিকে রাখতে পারলাম আরকে নির্দেশ করতে যে কোডটি পরবর্তী লাইনে অবিরত রয়েছে? যেমন পাইথনে "\"। তবে আপনার সমাধানটি স্ট্রিং ধারাবাহিকতার নির্দিষ্ট সমস্যার জন্য ভাল কাজ করে works
কৌতূহলী 2

14
অথবা আপনি আরও ভালভাবে পেস্ট0 (...) ব্যবহার করুন যা পেস্টের সমতুল্য (...,
sep

31
কিন্তু paste0এখনো উপস্থিত করেনি যখন আমি 2+ বছর পূর্বে উত্তর লিখেছে।
ডার্ক এডেলবুয়েটেল

দেখে মনে হচ্ছে সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে এবং আমি প্রত্যাখ্যানের সাথে কম-বেশি একমত। উত্তরটি এখনও সঠিক, এর প্রসঙ্গ রয়েছে এবং মন্তব্যগুলি এটি আপডেট করে।
ডার্ক এডেলবুয়েটেল

এর জন্য ধন্যবাদ. আমি ভুল বুঝেছি যে দীর্ঘ লাইনগুলি বিভক্ত করতে আপনাকে একটি প্লাস ব্যবহার করতে হবে। আমি আনন্দিত বাস্তবতা অনেক সহজ!
আইয়েন স্যামুয়েল ম্যাকলিন এল্ডার

143

বাহ, মন্তব্যগুলি খুব ছোট। যাইহোক, @ ডার্ক খুব সঠিক।

কোডটি পরবর্তী লাইনে শুরু হয় তা জানানোর দরকার নেই। এটি পাইথনের চেয়ে স্মার্ট ;-) এবং যখনই বিবৃতিটিকে "সমাপ্ত না করা" হিসাবে বিবেচনা করে কেবল পরবর্তী পংক্তিটি পড়তে থাকবে। প্রকৃতপক্ষে, আপনার ক্ষেত্রে এটি পরবর্তী লাইনেও গিয়েছিল, তবে আর "" এর মধ্যে রাখলে এটি অক্ষর হিসাবে ফিরে আসে।

মনে মনে, আপনাকে নিশ্চিত করতে হবে যে আপনার কোড শেষ হয়েছে না। তুলনা করা

a <- 1 + 2
+ 3

সঙ্গে

a <- 1 + 2 +
3

সুতরাং, একাধিক লাইনে কোড ছড়িয়ে দেওয়ার সময়, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আর জানে যে কোন কিছু আসছে কিনা তা:

  • একটি বন্ধনী খোলা রেখে, বা
  • অপারেটরের সাথে লাইন শেষ করা

যখন আমরা স্ট্রিংয়ের সাথে কথা বলি, এটি এখনও কার্যকর হয় তবে আপনাকে কিছুটা সতর্ক হওয়া দরকার। আপনি উদ্ধৃতি চিহ্নগুলি খুলতে পারেন এবং আপনি এটি বন্ধ না করা পর্যন্ত আর পড়া হবে। তবে নিউলাইন সহ প্রতিটি চরিত্রকে স্ট্রিংয়ের অংশ হিসাবে দেখা যাবে:

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()ডার্ক প্রস্তাবিত।


ধন্যবাদ জরিস কিছু অনলাইন ডকুমেন্টেশনে আপনি যেগুলি দিয়েছেন তার সাথে অনুরূপ উদাহরণগুলি আমি দেখেছি এবং স্ট্রিংয়ের জন্য এটিও চেষ্টা করেছি। আমি ভেবেছিলাম যে এটি যদি একটি সমাপ্ত উদ্ধৃতিটির মুখোমুখি না হয় তবে এটি পরবর্তী লাইনে অবিরত থাকবে। তবে স্ট্রিংয়ের সাহায্যে এটি কার্যকর হয় না বা আপনি যেমনটি বলেছিলেন তেমন ভিন্নভাবে কাজ করে এই অর্থে যে এটি একটি নতুন লাইনের চরিত্র হিসাবে প্রবেশ করে।
কৌতূহলী 2 বছর

এটি মাঝে মাঝে আপনি প্লাস চিহ্ন সহ লাইনগুলি কেন বিভক্ত করতে পারেন তা পরিষ্কার করার জন্য ধন্যবাদ !
আইয়েন স্যামুয়েল ম্যাকলিন বয়স্ক

8
না, এটি এখানে অজগর থেকে স্মার্ট নয়। বরং paste("~one",\n"/two")আপনি শুধু প্রয়োজন ("~one" \n "/two")। কমা এবং ড্রপ paste। ভাষা স্ম্যাকডাউন খুঁজছেন না। আমি উভয় ভাষা ব্যবহার করি তবে সর্বদা পেস্ট একটি বিরক্তি ছিল।
ফিল कूপার

2
@ জরিসমাইস রাইট, আমি সেই ভুল বিধি সংশোধন করার চেষ্টা করছিলাম। পেরেন ব্যবহার করুন এবং লাইনের ধারাবাহিকতার জন্য আপনার "\" লাগবে না। আমি এটা পছন্দ কারণ আপনার কাছে লাইন যা আপনি "\" সিনট্যাক্স সঙ্গে ব্যবহার করতে পারবেন না মন্তব্য (যেমন থাকতে পারে ("one"\n "/one.one" # some comment\n "/two")' এ উদাহরণ stackoverflow.com/questions/10660435/...
ফিল কুপার

1
leaving a bracket open, or ending the line with an operatorএই দুটি যেতে উপায়।
এসআইস্লাম

35

ডার্কের উপরের পদ্ধতিটি পুরোপুরি কার্যকর হবে, তবে যদি আপনি এমন একটি দীর্ঘ স্ট্রিং আনার কোনও উপায় সন্ধান করছেন যেখানে শ্বেতস্পেস / কাঠামো সংরক্ষণ করা গুরুত্বপূর্ণ (উদাহরণস্বরূপ: আরওডিসি ব্যবহার করে একটি এসকিউএল কোয়েরি) রয়েছে তবে দুটি ধাপের সমাধান রয়েছে।

1) একাধিক লাইন জুড়ে পাঠ্য স্ট্রিং আনুন

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

2) আর একগুচ্ছ \nচরিত্রের পরিচয় দেবে । ডকুমেন্টেশন অনুসারেstrwrap() সাদা স্টেস নষ্ট করে এমনদের সাথে স্ট্রিপ করুন :

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

আপনার পাঠ্যকে খুব দীর্ঘ সারিতে আবদ্ধ করতে স্ট্র্যাপকে বলার মাধ্যমে, আপনি কোনও একক অক্ষর ভেক্টর নেই যেখানে কোনও সাদা স্থান / নিউলাইন অক্ষর নেই।


3
আমি এই উত্তরটি সবচেয়ে পছন্দ করি কারণ স্ট্রিংটি বরং দীর্ঘ হলে আমাকে পেস্টের মতো অনেকগুলি কমা লিখতে হবে না। +1
ব্যবহারকারী 3032689

3
সচেতন থাকুন যে strwrapউত্স স্ট্রিং 10 কে অক্ষরের বেশি না থাকলেও একাধিক স্ট্রিংয়ের ভেক্টর ফিরে আসতে পারে। ব্যবহার করে দেখুন strwrap("a\n\nb")। এটি 3 দৈর্ঘ্যের ভেক্টরকে ফিরিয়ে দেবে এবং paste(strwrap("a\n\nb"), collapse=" ")ভেক্টর ভেঙে ফেলার জন্য আপনাকে স্পেস ক্যারেক্টার আঠার সাহায্যে এটি আবার পেস্ট করতে হবে ।
Gedrox

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]

আপনি যে প্রশ্নের উত্তর দেওয়ার চেষ্টা করছেন তা কি মিশ্রিত হতে পারে? ওপির প্রশ্নের সাথে এর কোনও যোগসূত্র নেই।
জেরওয়েক

এটা আছে। মূল প্রশ্ন হ'ল কোডের একটি লাইনকে কয়েকটি লাইনে বিভক্ত করা। আমি প্রমাণ করেছিলাম যে মূল প্রশ্নের চেয়ে আরও জটিল একটি উদাহরণ ব্যবহার করে। আমি ভেবেছিলাম এটি পোস্ট করা দরকার কারণ আমি নির্দিষ্ট সময়কার কোডটি কীভাবে বিভক্ত করতে পারি তা বুঝতে চেষ্টা করে অনেক সময় ব্যয় করেছি। এবং আমি অনুমান করি যে এটি একই ধরণের সমস্যার সাথে কাউকে সহায়তা করে।
এম টেরি

ওপির সমস্যাটি হ'ল লাইন ব্রেকের সাথে একটি চরিত্র ভেক্টরকে বিভক্ত করাতে চরিত্রের ভেক্টরের লাইনব্রেক অন্তর্ভুক্ত থাকে। আপনার উত্তরটি কেবলমাত্র ডেটা-টেক্সট সিনট্যাক্সের জন্য নির্দিষ্ট
জেরওয়েক

একাধিক লাইনের উপরে কোডের একটি লাইন বিভাজনের উদাহরণ হিসাবে
এম টেরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.