Pisahkan kode menjadi beberapa baris dalam skrip R.

139

Saya ingin membagi baris dalam skrip R menjadi beberapa baris (karena terlalu panjang). Bagaimana aku melakukan itu?

Secara khusus, saya memiliki garis seperti

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

Apakah mungkin untuk membagi jalur panjang menjadi beberapa baris? Saya mencoba

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

dengan returnkunci di akhir baris pertama; tapi itu tidak berhasil.

Terima kasih.

Curious2learn
sumber

Jawaban:

112

Anda tidak memecahkan kode dalam beberapa baris, melainkan satu pengenal . Ada perbedaan.

Untuk masalah Anda, coba

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

yang juga mengilustrasikan bahwa tidak masalah untuk memecah kode di beberapa baris.

Dirk Eddelbuettel
sumber
13
Terima kasih! Saya bertanya-tanya apakah ada karakter yang bisa saya letakkan di akhir baris untuk menunjukkan ke R bahwa kode tersebut berlanjut di baris berikutnya. Seperti "\" dengan Python. Namun, solusi Anda bekerja dengan baik untuk masalah khusus kelanjutan string.
Curious2learn
14
atau Anda lebih baik menggunakan paste0 (...) yang setara dengan paste (..., sep = "")
gkcn
32
Tetapi paste0belum ada ketika saya menulis jawabannya 2+ tahun yang lalu.
Dirk Eddelbuettel
Sepertinya suntingan ditolak, dan saya kurang lebih setuju dengan penolakan tersebut. Jawabannya masih benar, ada konteksnya dan komentar memperbaruinya.
Dirk Eddelbuettel
Terima kasih untuk ini. Saya salah paham bahwa Anda perlu menggunakan plus untuk memisahkan garis panjang. Saya senang kenyataannya jauh lebih sederhana!
Iain Samuel McLean Elder
151

Bah, komentar terlalu kecil. Ngomong-ngomong, @Dirk benar sekali.

R tidak perlu diberi tahu bahwa kode tersebut dimulai pada baris berikutnya. Ini lebih pintar dari Python ;-) dan hanya akan terus membaca baris berikutnya setiap kali menganggap pernyataan sebagai "belum selesai". Sebenarnya, dalam kasus Anda, ini juga pergi ke baris berikutnya, tetapi R mengambil pengembalian sebagai karakter ketika ditempatkan di antara "".

Ingat, Anda harus memastikan kode Anda belum selesai. Membandingkan

a <- 1 + 2
+ 3

dengan

a <- 1 + 2 +
3

Jadi, saat menyebarkan kode ke beberapa baris, Anda harus memastikan bahwa R mengetahui sesuatu akan datang, baik dengan:

  • membiarkan braket terbuka, atau
  • mengakhiri baris dengan operator

Saat kita berbicara tentang string, ini masih berfungsi tetapi Anda harus sedikit berhati-hati. Anda dapat membuka tanda kutip dan R akan terus membaca sampai Anda menutupnya. Tetapi setiap karakter, termasuk baris baru, akan dilihat sebagai bagian dari string:

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.

Itulah alasan mengapa dalam kasus ini, kode Anda tidak berfungsi: jalur tidak boleh berisi karakter baris baru ( \n). Jadi itu juga mengapa Anda lebih baik menggunakan solusi dengan paste()atau yang paste0()diusulkan Dirk.

Joris Meys
sumber
Terima kasih Joris. Saya melihat contoh yang mirip dengan yang telah Anda berikan di beberapa dokumentasi online dan mencobanya untuk string juga. Saya pikir jika tidak menemukan kutipan penutup, itu akan berlanjut ke baris berikutnya. Tetapi dengan string itu tidak berfungsi, atau lebih tepatnya, seperti yang Anda katakan, bekerja dengan cara yang berbeda dalam arti itu mengambil enter sebagai karakter baris baru.
Curious2learn
Terima kasih telah menjelaskan mengapa terkadang Anda dapat memisahkan garis dengan tanda tambah!
Iain Samuel McLean Elder
9
tidak, ini tidak lebih pintar dari python di sini. daripada paste("~one",\n"/two")Anda hanya perlu ("~one" \n "/two"). hilangkan koma dan paste. Tidak mencari bahasa smackdown. Saya menggunakan kedua bahasa tetapi selalu meskipun paste itu mengganggu.
Phil Cooper
2
@ JorisMeys Benar, saya mencoba untuk memperbaiki kesalahan pernyataan itu. Gunakan tanda kurung dan Anda tidak memerlukan "\" untuk kelanjutan baris. Saya menyukainya karena Anda juga dapat memiliki komentar pada baris yang tidak dapat Anda lakukan dengan sintaks "\" (misalnya, ("one"\n "/one.one" # some comment\n "/two")' contoh di stackoverflow.com/questions/10660435/…
Phil Cooper
1
leaving a bracket open, or ending the line with an operatorkeduanya adalah cara untuk pergi.
SIslam
36

Metode Dirk di atas benar-benar akan berfungsi, tetapi jika Anda mencari cara untuk memasukkan string panjang di mana spasi / struktur penting untuk dipertahankan (contoh: kueri SQL menggunakan RODBC) ada solusi dua langkah.

1) Masukkan string teks ke dalam beberapa baris

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

2) R akan memperkenalkan banyak \nkarakter. Hapus mereka dengan strwrap(), yang menghancurkan spasi, sesuai dengan dokumentasi :

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

Dengan memberi tahu strwrap untuk membungkus teks Anda ke baris yang sangat, sangat panjang, Anda mendapatkan vektor karakter tunggal tanpa spasi / karakter baris baru.

Andrew
sumber
3
Saya paling suka jawaban ini karena saya tidak perlu menulis banyak koma seperti dengan paste, jika stringnya agak panjang. +1
pengguna3032689
3
Ketahuilah bahwa strwrapmungkin mengembalikan vektor beberapa string meskipun string sumber tidak melebihi 10k karakter. Coba strwrap("a\n\nb"). Ini akan mengembalikan vektor dengan panjang 3 dan Anda perlu menempelkannya kembali menggunakan paste(strwrap("a\n\nb"), collapse=" ")lem karakter spasi untuk menutup vektor.
Gedrox
18

Untuk kasus khusus itu ada file.path:

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

Saya tahu posting ini sudah tua, tetapi saya memiliki situasi seperti ini dan hanya ingin membagikan solusi saya. Semua jawaban di atas berfungsi dengan baik. Tetapi jika Anda memiliki Kode seperti yang ada dalam sintaks rantai data.table, itu menjadi sedikit menantang. misalnya saya punya masalah seperti ini.

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]]][waktu]<=12000]

Saya mencoba sebagian besar saran di atas dan tidak berhasil. tapi saya menemukan bahwa mereka dapat dipisahkan setelah koma di dalamnya []. Memisahkan saat ][tidak berhasil.

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]
M Terry
sumber
Mungkinkah Anda mencampurkan pertanyaan yang coba Anda jawab? Ini tidak ada hubungannya dengan pertanyaan OP.
zerweck
Itu memang punya. Pertanyaan utamanya adalah bagaimana membagi baris kode menjadi beberapa baris. Saya mendemonstrasikannya dengan menggunakan contoh lain yang sedikit lebih kompleks daripada pertanyaan aslinya. Saya pikir perlu untuk mempostingnya karena saya menghabiskan banyak waktu mencoba mencari cara untuk membagi bagian kode tersebut. Dan saya rasa itu membantu seseorang dengan masalah serupa.
M Terry
Masalah OP adalah bahwa memecah vektor karakter dengan pemutusan garis termasuk pemutusan garis dalam vektor karakter. Jawaban Anda hanya khusus untuk sintaks
data.table
Sebagai contoh pemisahan baris kode menjadi beberapa baris
M Terry