แยกโค้ดหลายบรรทัดในสคริปต์ R


139

ฉันต้องการแบ่งบรรทัดในสคริปต์ R เป็นหลายบรรทัด (เพราะยาวเกินไป) ฉันจะทำอย่างไร

โดยเฉพาะฉันมีบรรทัดเช่น

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คีย์ที่ท้ายบรรทัดแรก แต่ไม่ได้ผล

ขอบคุณ.

คำตอบ:


112

คุณยังไม่ได้หมดรหัสมากกว่าหลายบรรทัด แต่ตัวระบุเดียว มีความแตกต่าง

สำหรับปัญหาของคุณลอง

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

ซึ่งยังแสดงให้เห็นว่าการแบ่งโค้ดในหลายบรรทัดทำได้ดี


13
ขอบคุณ! ฉันสงสัยว่ามีอักขระที่ฉันสามารถใส่ไว้ที่ท้ายบรรทัดเพื่อระบุให้ R รหัสยังคงอยู่ในบรรทัดถัดไป เช่น "\" ใน Python อย่างไรก็ตามโซลูชันของคุณใช้ได้ดีกับปัญหาเฉพาะของความต่อเนื่องของสตริง
Curious2learn

14
หรือคุณควรใช้ paste0 (... ) ซึ่งเทียบเท่ากับ paste (... , sep = "")
gkcn

32
แต่paste0ยังไม่มีเมื่อฉันเขียนคำตอบเมื่อ 2+ ปีที่แล้ว
Dirk Eddelbuettel

ดูเหมือนว่าการแก้ไขจะถูกปฏิเสธและฉันเห็นด้วยกับการปฏิเสธไม่มากก็น้อย คำตอบยังคงถูกต้องมีบริบทและความคิดเห็นจะอัปเดต
Dirk Eddelbuettel

ขอบคุณสำหรับสิ่งนี้. ฉันเข้าใจผิดว่าคุณต้องใช้เครื่องหมายบวกเพื่อแยกบรรทัดยาว ฉันดีใจที่ความจริงมันง่ายกว่านี้มาก!
Iain Samuel McLean Elder

151

บาความคิดเห็นน้อยเกินไป อย่างไรก็ตาม @ เดิร์กพูดถูกมาก

R ไม่จำเป็นต้องบอกรหัสเริ่มต้นที่บรรทัดถัดไป ฉลาดกว่า Python ;-) และจะอ่านบรรทัดถัดไปเมื่อใดก็ตามที่พิจารณาว่าข้อความนั้น "ยังไม่เสร็จสิ้น" อันที่จริงในกรณีของคุณมันก็ไปที่บรรทัดถัดไปเช่นกัน แต่ R รับผลตอบแทนเป็นอักขระเมื่ออยู่ระหว่าง ""

โปรดทราบว่าคุณจะต้องแน่ใจว่ารหัสของคุณยังไม่เสร็จสิ้น เปรียบเทียบ

a <- 1 + 2
+ 3

ด้วย

a <- 1 + 2 +
3

ดังนั้นเมื่อแพร่กระจายโค้ดไปหลายบรรทัดคุณต้องแน่ใจว่า R รู้ว่ามีบางอย่างกำลังจะมาโดย:

  • เปิดวงเล็บทิ้งไว้หรือ
  • สิ้นสุดบรรทัดด้วยตัวดำเนินการ

เมื่อเรากำลังพูดถึงสตริงสิ่งนี้ยังคงใช้ได้ แต่คุณต้องระวังนิดนึง คุณสามารถเปิดเครื่องหมายคำพูดและ 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()Dirk เสนอ


ขอบคุณ Joris ฉันเห็นตัวอย่างที่คล้ายกับตัวอย่างที่คุณให้ไว้ในเอกสารออนไลน์และลองใช้กับสตริงด้วย ฉันคิดว่าหากไม่พบคำพูดปิดก็จะไปยังบรรทัดถัดไป แต่ด้วยสตริงมันใช้งานไม่ได้หรืออย่างที่คุณบอกว่าจะทำงานในรูปแบบที่แตกต่างออกไปในแง่ที่ต้องป้อนเป็นอักขระบรรทัดใหม่
Curious2learn

ขอขอบคุณที่ทำให้ชัดเจนว่าทำไมบางครั้งคุณสามารถแยกบรรทัดด้วยเครื่องหมายบวก!
Iain Samuel McLean Elder

9
ไม่มันไม่ฉลาดไปกว่า python ที่นี่ มากกว่าคุณเพียงแค่ต้องpaste("~one",\n"/two") ("~one" \n "/two")วางลูกน้ำและpaste. ไม่ได้มองว่าเป็นภาษาที่แย่ลง ฉันใช้ทั้งสองภาษา แต่การวางก็น่ารำคาญเสมอ
Phil Cooper

2
@JorisMeys ใช่ฉันพยายามแก้ไขการแสดงข้อมูลที่ขัดต่อข้อเท็จจริงนั้น ใช้ parens และคุณไม่จำเป็นต้องใช้ "\" สำหรับความต่อเนื่องของบรรทัด ฉันชอบเพราะคุณสามารถแสดงความคิดเห็นในบรรทัดที่คุณไม่สามารถทำได้ด้วยไวยากรณ์ "\" (เช่น("one"\n "/one.one" # some comment\n "/two")' ตัวอย่างในstackoverflow.com/questions/10660435/…
Phil Cooper

1
leaving a bracket open, or ending the line with an operatorสองสิ่งนี้คือหนทางที่จะไป
SIslam

36

วิธีการของ Dirk ข้างต้นจะใช้งานได้จริง แต่ถ้าคุณกำลังมองหาวิธีที่จะนำสตริงที่ยาวซึ่งช่องว่าง / โครงสร้างเป็นสิ่งสำคัญในการรักษา (ตัวอย่าง: แบบสอบถาม SQL โดยใช้ RODBC) มีวิธีแก้ปัญหาสองขั้นตอน

1) นำสตริงข้อความในหลายบรรทัด

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

2) R จะแนะนำ\nตัวละครมากมาย ตัดสิ่งเหล่านั้นออกstrwrap()ซึ่งทำลายช่องว่างตามเอกสารประกอบ :

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

การบอกให้ strwrap ตัดข้อความของคุณเป็นแถวที่ยาวมาก ๆ คุณจะได้เวกเตอร์อักขระเดียวโดยไม่มีอักขระเว้นวรรค / ขึ้นบรรทัดใหม่


3
ฉันชอบคำตอบนี้มากที่สุดเพราะฉันไม่ต้องเขียนจุลภาคมากนักเช่นเดียวกับการวางหากสตริงค่อนข้างยาว +1
user3032689

3
โปรดทราบว่าstrwrapอาจส่งคืนเวกเตอร์ของหลายสตริงแม้ว่าสตริงต้นทางจะไม่เกิน 10k อักขระ ลองstrwrap("a\n\nb"). มันจะส่งคืนเวกเตอร์ของความยาว 3 และคุณต้องวางกลับโดยpaste(strwrap("a\n\nb"), collapse=" ")ใช้กาวอักขระเว้นวรรคเพื่อยุบเวกเตอร์
Gedrox

18

สำหรับกรณีเฉพาะนั้นมีfile.path:

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

0

ฉันรู้ว่าโพสต์นี้เก่า แต่ฉันมีสถานการณ์เช่นนี้และต้องการแบ่งปันวิธีแก้ปัญหาของฉัน คำตอบทั้งหมดข้างต้นใช้ได้ดี แต่ถ้าคุณมี Code เช่นที่อยู่ใน data.table Chaining Syntax มันจะกลายเป็นเรื่องที่ท้าทาย เช่นฉันมีปัญหาเช่นนี้

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]]][เวลา _ [s]<=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]

เป็นไปได้ไหมที่คุณจะผสมคำถามที่คุณพยายามจะตอบ? สิ่งนี้ไม่เกี่ยวข้องกับคำถามของ OP
zerweck

มันมี คำถามหลักคือจะแบ่งบรรทัดของโค้ดออกเป็นหลายบรรทัดได้อย่างไร ฉันแสดงให้เห็นว่าโดยใช้ตัวอย่างอื่นที่ซับซ้อนกว่าคำถามเดิม ฉันคิดว่ามันจำเป็นที่จะต้องโพสต์มันเพราะฉันใช้เวลาส่วนใหญ่ในการพยายามหาวิธีแยกส่วนของโค้ดนั้น ๆ และฉันเดาว่ามันช่วยคนที่มีปัญหาคล้าย ๆ กัน
M Terry

ปัญหาของ OP คือการแยกเวกเตอร์อักขระด้วย linebreak รวมถึง linebreak ในเวกเตอร์อักขระ คำตอบของคุณเฉพาะสำหรับไวยากรณ์
data.table เท่านั้น

ดังตัวอย่างของการแยกบรรทัดของโค้ดในหลายบรรทัด
M Terry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.