Tách mã trên nhiều dòng trong tập lệnh R


137

Tôi muốn tách một dòng trong tập lệnh R thành nhiều dòng (vì nó quá dài). Làm thế nào để làm điều đó?

Cụ thể, tôi có một dòng như

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

Có thể phân chia con đường dài trên nhiều dòng? Tôi đã thử

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

với returnkhóa ở cuối dòng đầu tiên; nhưng điều đó không làm việc

Cảm ơn.

Câu trả lời:


107

Bạn không vi phạm trên nhiều dòng, mà là một mã định danh duy nhất . Có một sự khác biệt.

Đối với vấn đề của bạn, hãy thử

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

điều này cũng minh họa rằng việc phá mã trên nhiều dòng là hoàn toàn tốt.


13
Cảm ơn! Tôi đã tự hỏi nếu có một ký tự mà tôi có thể đặt ở cuối dòng để chỉ ra cho R rằng mã tiếp tục ở dòng tiếp theo. Chẳng hạn như "\" trong Python. Tuy nhiên, giải pháp của bạn hoạt động tốt cho vấn đề cụ thể của việc tiếp tục chuỗi.
Curious2learn

14
hoặc tốt hơn là bạn sử dụng paste0 (...) tương đương với dán (..., sep = "")
gkcn

31
Nhưng paste0vẫn chưa tồn tại khi tôi viết câu trả lời hơn 2 năm trước.
Dirk Eddelbuettel

Có vẻ như bản chỉnh sửa đã bị từ chối và tôi ít nhiều đồng ý với việc từ chối. Câu trả lời vẫn đúng, có bối cảnh và các bình luận cập nhật nó.
Dirk Eddelbuettel

Cảm ơn vì điều đó. Tôi đã hiểu sai rằng bạn cần sử dụng một dấu cộng để phân chia các dòng dài. Tôi rất vui vì thực tế đơn giản hơn nhiều!
Iain Samuel McLean Elder

142

Bah, ý kiến ​​quá nhỏ. Dù sao, @Dirk rất đúng.

R không cần phải nói mã bắt đầu ở dòng tiếp theo. Nó thông minh hơn Python ;-) và sẽ tiếp tục đọc dòng tiếp theo bất cứ khi nào nó coi câu lệnh là "chưa kết thúc". Trên thực tế, trong trường hợp của bạn, nó cũng đã đi đến dòng tiếp theo, nhưng R lấy sự trở lại là một ký tự khi nó được đặt giữa "".

Nhắc bạn, bạn sẽ phải đảm bảo mã của bạn chưa kết thúc. Đối chiếu

a <- 1 + 2
+ 3

với

a <- 1 + 2 +
3

Vì vậy, khi trải rộng mã trên nhiều dòng, bạn phải chắc chắn rằng R biết điều gì đó sắp xảy ra, bằng cách:

  • để một khung mở, hoặc
  • kết thúc dòng với một toán tử

Khi chúng ta đang nói chuyện, điều này vẫn hoạt động nhưng bạn cần cẩn thận một chút. Bạn có thể mở dấu ngoặc kép và R sẽ đọc tiếp cho đến khi bạn đóng nó. Nhưng mọi ký tự, bao gồm cả dòng mới, sẽ được xem như là một phần của chuỗi:

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.

Đó là lý do tại sao trong trường hợp này, mã của bạn không hoạt động: một đường dẫn không thể chứa ký tự dòng mới ( \n). Vì vậy, đó cũng là lý do tại sao bạn nên sử dụng giải pháp tốt hơn với paste()hoặc paste0()đề xuất Dirk.


Cảm ơn Joris. Tôi đã thấy các ví dụ tương tự như các ví dụ bạn đã đưa ra trong một số tài liệu trực tuyến và cũng đã thử điều đó cho chuỗi. Tôi nghĩ rằng nếu nó không gặp phải một trích dẫn kết thúc, nó sẽ tiếp tục đến dòng tiếp theo. Nhưng với chuỗi, nó không hoạt động, hay đúng hơn, như bạn đã nói, hoạt động theo một cách khác theo nghĩa là nó được nhập như một ký tự dòng mới.
Curious2learn

Cảm ơn đã làm rõ lý do tại sao đôi khi bạn có thể chia dòng bằng dấu cộng!
Iain Samuel McLean Elder

8
không, nó không thông minh hơn trăn ở đây. thay vì paste("~one",\n"/two")bạn chỉ cần ("~one" \n "/two"). thả dấu phẩy và paste. Không tìm kiếm ngôn ngữ smackdown. Tôi sử dụng cả hai ngôn ngữ nhưng luôn luôn mặc dù dán là một phiền toái.
Phil Cooper

2
@JorisMeys Phải, tôi đã cố gắng sửa chữa sai lầm đó. Sử dụng parens và bạn không cần "\" để tiếp tục dòng. Tôi thích nó bởi vì bạn cũng có thể có nhận xét về các dòng mà bạn không thể thực hiện với cú pháp "\" (ví dụ: ("one"\n "/one.one" # some comment\n "/two")' ví dụ trong stackoverflow.com/questions/10660435/ Lỗi
Phil Cooper

1
leaving a bracket open, or ending the line with an operatorHai cái này là con đường để đi.
SIslam

35

Phương pháp của Dirk ở trên sẽ hoàn toàn hoạt động, nhưng nếu bạn đang tìm cách đưa vào một chuỗi dài trong đó khoảng trắng / cấu trúc là quan trọng để bảo tồn (ví dụ: truy vấn SQL sử dụng RODBC) có một giải pháp hai bước.

1) Đưa chuỗi văn bản qua nhiều dòng

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

2) R sẽ giới thiệu một loạt các \nnhân vật. Loại bỏ những thứ đó với strwrap(), phá hủy khoảng trắng, theo tài liệu :

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

Bằng cách yêu cầu strwrap bọc văn bản của bạn thành một hàng rất dài, bạn sẽ có được một vectơ ký tự duy nhất không có khoảng trắng / ký tự dòng mới.


3
Tôi thích câu trả lời này nhất vì tôi không phải viết quá nhiều dấu phẩy như khi dán, nếu chuỗi khá dài. +1
dùng3032689

3
Xin lưu ý rằng strwrapcó thể trả về vectơ của nhiều chuỗi ngay cả khi chuỗi nguồn không vượt quá 10k ký tự. Hãy thử strwrap("a\n\nb"). Nó sẽ trả về vectơ có độ dài 3 và bạn cần dán lại bằng paste(strwrap("a\n\nb"), collapse=" ")cách sử dụng keo ký tự không gian để thu gọn vectơ.
Gedrox

17

Đối với trường hợp cụ thể đó là file.path:

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

0

Tôi biết bài đăng này đã cũ, nhưng tôi đã có một Tình huống như thế này và chỉ muốn chia sẻ giải pháp của tôi. Tất cả các câu trả lời trên hoạt động tốt. Nhưng nếu bạn có một Mã như các mã trong data.table chained Syntax thì nó trở nên khó khăn. ví dụ tôi có một vấn đề như thế này

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]]][thời gian_ [s]<=12000]

Tôi đã thử hầu hết các đề xuất ở trên và chúng không hoạt động. nhưng tôi đã tìm ra rằng chúng có thể được phân chia sau dấu phẩy bên trong []. Tách tại ][didn công việc.

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]

Có thể là bạn trộn lẫn câu hỏi mà bạn đang cố gắng trả lời? Điều này không liên quan gì đến câu hỏi của OP.
zerweck

Nó có. Câu hỏi chính là làm thế nào để tách một dòng mã thành nhiều dòng. Tôi đã chứng minh rằng bằng cách sử dụng một ví dụ khác phức tạp hơn câu hỏi ban đầu. Tôi nghĩ rằng nó là cần thiết để đăng nó bởi vì tôi đã dành rất nhiều thời gian để cố gắng tìm ra cách phân chia đoạn mã cụ thể đó. Và tôi đoán nó giúp được ai đó với một vấn đề tương tự.
M Terry

Vấn đề của OP là việc tách một vectơ ký tự với ngắt dòng bao gồm ngắt dòng trong vectơ ký tự. Câu trả lời của bạn chỉ dành riêng cho cú pháp
data.table

Như một ví dụ về việc tách một dòng mã trên nhiều dòng
M Terry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.