Kodu bir R komut dosyasında birden çok satıra bölme


137

Birden çok satır üzerinde bir R komut dosyasında bir satırı bölmek istiyorum (çok uzun olduğu için). Bunu nasıl yaparım?

Özellikle, benim gibi bir çizgi var

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

Uzun yolu birden çok satıra bölmek mümkün mü? denedim

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

ile returnilk satırının sonunda anahtar; ama bu işe yaramıyor.

Teşekkürler.

Yanıtlar:


108

Sen kırma değildir kod çoklu hatları üzerinden değil, tek bir tanımlayıcı . Bir fark var.

Sorununuz için deneyin

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

bu da kodu birden çok satıra bölmenin mükemmel olduğunu gösterir.


13
Teşekkürler! Satır sonunda kod bir sonraki satırda devam ettiğini belirtmek için koyabileceğiniz bir karakter olup olmadığını merak ediyordum. Python'da "\" gibi. Bununla birlikte, çözümünüz sicim devam sorunu için iyi çalışır.
Curious2learn

14
veya macunla eşdeğer olan paste0 (...) kullanmanız daha iyi (..., sep = "")
gkcn

31
Ama paste0cevabı 2 yıl veya daha önce yazdığımda henüz yoktu.
Dirk Eddelbuettel

Düzenlemenin reddedildiği anlaşılıyor ve reddetme konusunda aşağı yukarı katılıyorum. Cevap hala doğrudur, bağlamı vardır ve yorumlar onu günceller.
Dirk Eddelbuettel

Bunun için teşekkürler. Uzun çizgileri ayırmak için bir artı kullanmanız gerektiğini yanlış anladım. Gerçekliğin çok daha basit olduğuna sevindim!
Iain Samuel McLean Elder

145

Bah, yorumlar çok küçük. Her neyse, @Dirk çok haklı.

R'nin kodun bir sonraki satırdan başladığı söylenmesine gerek yoktur. Python ;-)'den daha akıllıdır ve ifadeyi "tamamlanmadı" olarak değerlendirdiğinde bir sonraki satırı okumaya devam edecektir. Aslında, sizin durumunuzda da bir sonraki satıra gider, ancak R "" arasına yerleştirildiğinde bir karakter olarak geri döner.

Dikkat edin, kodunuzun bitmediğinden emin olmanız gerekir. Karşılaştırmak

a <- 1 + 2
+ 3

ile

a <- 1 + 2 +
3

Bu nedenle, kodu birden çok satıra dağıtırken, R'nin bir şeyin geldiğini bildiğinden emin olmalısınız:

  • bir braketi açık bırakarak veya
  • bir operatörle hattın sonlandırılması

Dizelerden bahsederken, bu hala işe yarıyor ama biraz dikkatli olmanız gerekiyor. Tırnak işaretlerini açabilirsiniz ve siz kapatana kadar R okuyacaktır. Ancak yeni satır dahil her karakter dizenin bir parçası olarak görülecektir:

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.

Bu durumda, kodunuzun çalışmadığının nedeni budur: bir yol yeni satır karakteri ( \n) içeremez . Bu yüzden çözümü paste()veya paste0()Dirk'in önerisini daha iyi kullanmanızın nedeni de budur .


Teşekkürler Joris. Bazı çevrimiçi belgelerde verdiklerinize benzer örnekler gördüm ve bunu dize için de denedim. Bir kapanış teklifiyle karşılaşmazsa, bir sonraki satıra devam edeceğini düşündüm. Ancak dize ile çalışmaz, ya da daha önce söylediğiniz gibi, yeni bir çizgi karakteri olarak girilmesi anlamında farklı bir şekilde çalışır.
Curious2learn

Neden bazen artı işaretli satırları ayırabileceğinizi açıkladığınız için teşekkür ederiz !
Iain Samuel McLean Elder

8
Hayır, burada python'dan daha akıllı değil. paste("~one",\n"/two")sadece ihtiyacınız olandan daha fazla ("~one" \n "/two"). virgül ve paste. Dile bakmıyorum. Her iki dili de kullanıyorum ama her zaman macun bir sıkıntıydı.
Phil Cooper

2
@JorisMeys Doğru, bu yanlışlığı düzeltmeye çalışıyordum. Parens kullanın ve satır devam için "\" gerekmez. Bunu seviyorum çünkü "\" sözdizimi ile yapamayacağınız satırlara da yorum yapabilirsiniz (örneğin ("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 operatorbu ikisi gidilecek yoldur.
SIslam

35

Yukarıdaki Dirk yöntemi kesinlikle işe yarayacaktır, ancak boşluk / yapının korunması önemli olan uzun bir dize getirmenin bir yolunu arıyorsanız (örnek: RODBC kullanan bir SQL sorgusu) iki adımlı bir çözüm vardır.

1) Metin dizesini birden çok satıra getirin

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

2) R bir grup \nkarakteri tanıtacaktır . Boşlukları strwrap()tahrip eden belgeleri belgelere göre ayırın :

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

Strwrap'e metninizi çok, çok uzun bir satıra sarmasını söyleyerek, boşluk / satırsonu karakteri olmayan tek bir karakter vektörü elde edersiniz.


3
Bu cevabı en çok seviyorum çünkü eğer dize oldukça uzunsa, macun gibi çok virgül yazmak zorunda değilim. +1
user3032689

3
Unutmayın strwrapbirden dizeleri kudreti dönüş vektör kaynak dize 10k karakterden fazla olmasa bile. Deneyin strwrap("a\n\nb"). Uzunluğu 3 olan vektörü döndürür ve vektörü paste(strwrap("a\n\nb"), collapse=" ")daraltmak için bir boşluk karakteri tutkalı kullanarak geri yapıştırmanız gerekir .
Gedrox

18

Bu özel durum için file.path:

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

0

Bu yazının eski olduğunu biliyorum, ancak böyle bir Durumum vardı ve sadece çözümümü paylaşmak istiyorum. Yukarıdaki tüm cevaplar iyi çalışıyor. Ancak data.table zincirleme sözdizimindeki gibi bir Kodunuz varsa, bu zorlaşır. örneğin böyle bir Sorun yaşadım.

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

Yukarıdaki önerilerin çoğunu denedim ve işe yaramadı. ama içlerindeki virgülden sonra bölünebileceklerini anladım []. Bölme işlemi ][işe yaramıyor.

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]

Cevaplamaya çalıştığınız soruyu karıştırabilir misiniz? Bunun OP'nin sorusuyla bir ilgisi yok.
zerweck

Var. Ana soru, bir kod satırının birkaç satıra nasıl bölüneceğidir. Bunu, orijinal sorudan daha karmaşık olan başka bir örnek kullanarak gösterdim. Göndermenin gerekli olduğunu düşündüm çünkü o kodun nasıl bölüneceğini anlamaya çalışmak için çok zaman harcadım. Ve sanırım benzer bir sorunu olan birine yardım ediyor.
M Terry

OP'nin problemi, bir karakter vektörünün bir satır kırılmasıyla bölünmesinin karakter vektöründeki satır kırılmasını içermesidir. Cevabınız yalnızca data.table sözdizimine
özgüdür

Bir kod satırını birden çok satıra bölme örneği olarak
M Terry
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.