Teilen Sie den Code in einem R-Skript auf mehrere Zeilen auf

137

Ich möchte eine Zeile in einem R-Skript auf mehrere Zeilen aufteilen (weil sie zu lang ist). Wie mache ich das?

Insbesondere habe ich eine Zeile wie

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

Ist es möglich, den langen Pfad auf mehrere Zeilen aufzuteilen? Ich habe es versucht

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

mit returnSchlüssel am Ende der ersten Zeile; aber das funktioniert nicht.

Vielen Dank.

Curious2learn
quelle

Antworten:

107

Sie brechen den Code nicht über mehrere Zeilen, sondern über einen einzelnen Bezeichner . Da ist ein Unterschied.

Versuchen Sie es mit Ihrem Problem

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

Dies zeigt auch, dass es vollkommen in Ordnung ist, Code über mehrere Zeilen hinweg zu unterbrechen.

Dirk Eddelbuettel
quelle
13
Vielen Dank! Ich habe mich gefragt, ob es ein Zeichen gibt, das ich am Ende der Zeile einfügen kann, um R anzuzeigen, dass der Code in der nächsten Zeile fortgesetzt wird. Wie "\" in Python. Ihre Lösung eignet sich jedoch gut für das spezifische Problem der Zeichenfolgenfortsetzung.
Curious2learn
14
oder Sie verwenden besser paste0 (...), was paste (..., sep = "") entspricht
gkcn
31
Aber paste0existierte noch nicht, als ich die Antwort vor 2+ Jahren schrieb.
Dirk Eddelbuettel
Es sieht so aus, als ob die Bearbeitung abgelehnt wurde, und ich stimme der Ablehnung mehr oder weniger zu. Die Antwort ist immer noch richtig, hat ihren Kontext und die Kommentare aktualisieren ihn.
Dirk Eddelbuettel
Danke dafür. Ich habe falsch gelernt, dass Sie ein Pluszeichen verwenden müssen, um lange Zeilen zu teilen. Ich bin froh, dass die Realität viel einfacher ist!
Iain Samuel McLean Elder
142

Bah, Kommentare sind zu klein. Wie auch immer, @Dirk ist sehr richtig.

R muss nicht mitgeteilt werden, dass der Code in der nächsten Zeile beginnt. Es ist schlauer als Python ;-) und liest einfach die nächste Zeile weiter, wenn es die Aussage als "nicht fertig" betrachtet. In Ihrem Fall ging es tatsächlich auch in die nächste Zeile, aber R nimmt die Rückgabe als Zeichen, wenn sie zwischen "" steht.

Wohlgemerkt, Sie müssen sicherstellen, dass Ihr Code nicht fertig ist. Vergleichen Sie

a <- 1 + 2
+ 3

mit

a <- 1 + 2 +
3

Wenn Sie also Code über mehrere Zeilen verteilen, müssen Sie sicherstellen, dass R weiß, dass etwas kommt, entweder durch:

  • eine Klammer offen lassen oder
  • Beenden der Zeile mit einem Operator

Wenn wir über Strings sprechen, funktioniert dies immer noch, aber Sie müssen etwas vorsichtig sein. Sie können die Anführungszeichen öffnen und R liest weiter, bis Sie es schließen. Aber jedes Zeichen, einschließlich der Newline, wird als Teil der Zeichenfolge angesehen:

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.

Aus diesem Grund hat Ihr Code in diesem Fall nicht funktioniert: Ein Pfad darf kein Zeilenumbruchzeichen ( \n) enthalten. Deshalb sollten Sie die Lösung auch besser mit paste()oder von paste0()Dirk vorgeschlagen verwenden.

Joris Meys
quelle
Danke Joris. Ich habe die Beispiele ähnlich denen gesehen, die Sie in der Online-Dokumentation angegeben haben, und das auch für die Zeichenfolge versucht. Ich dachte, wenn es kein abschließendes Zitat gibt, wird es mit der nächsten Zeile fortfahren. Aber mit String funktioniert es nicht oder, wie Sie sagten, anders, in dem Sinne, dass Enter als neues Zeilenzeichen verwendet wird.
Curious2learn
Vielen Dank, dass Sie klargestellt haben, warum Sie manchmal Linien mit einem Pluszeichen teilen können!
Iain Samuel McLean Elder
8
Nein, es ist hier nicht schlauer als Python. anstatt paste("~one",\n"/two")nur zu brauchen ("~one" \n "/two"). Lassen Sie die Kommas und die paste. Ich sehe nicht nach Sprache aus. Ich benutze beide Sprachen, habe aber immer gedacht, dass Paste ein Ärgernis war.
Phil Cooper
2
@JorisMeys Richtig, ich habe versucht, diese falsche Darstellung zu korrigieren. Verwenden Sie Parens und Sie benötigen kein "\" für die Fortsetzung der Leitung. Ich mag es, weil Sie auch Kommentare zu Zeilen haben können, die Sie mit der "\" -Syntax nicht tun können (z. B. ("one"\n "/one.one" # some comment\n "/two")' Beispiele in stackoverflow.com/questions/10660435/…
Phil Cooper,
1
leaving a bracket open, or ending the line with an operatorDiese beiden sind der richtige Weg.
Islam
35

Die obige Methode von Dirk wird absolut funktionieren, aber wenn Sie nach einer Möglichkeit suchen, eine lange Zeichenfolge einzufügen, bei der Leerzeichen / Strukturen wichtig sind (Beispiel: eine SQL-Abfrage mit RODBC), gibt es eine zweistufige Lösung.

1) Bringen Sie die Textzeichenfolge über mehrere Zeilen

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

2) R führt eine Reihe von \nZeichen ein. Entfernen Sie diese mit strwrap(), was Leerzeichen zerstört, gemäß der Dokumentation :

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

Wenn Sie strwrap anweisen, Ihren Text in eine sehr, sehr lange Zeile zu setzen, erhalten Sie einen einzelnen Zeichenvektor ohne Leerzeichen / Zeilenumbrüche.

Andrew
quelle
3
Diese Antwort gefällt mir am besten, weil ich nicht so viele Kommas schreiben muss wie beim Einfügen, wenn die Zeichenfolge ziemlich lang ist. +1
user3032689
3
Beachten Sie, dass der strwrapVektor mehrerer Zeichenfolgen möglicherweise zurückgegeben wird, auch wenn die Quellzeichenfolge nicht länger als 10.000 Zeichen ist. Versuchen Sie es strwrap("a\n\nb"). Es wird ein Vektor der Länge 3 zurückgegeben, und Sie müssen ihn paste(strwrap("a\n\nb"), collapse=" ")mit einem Leerzeichen-Kleber wieder einfügen, um den Vektor zu reduzieren.
Gedrox
17

Für diesen speziellen Fall gibt es file.path:

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

Ich weiß, dass dieser Beitrag alt ist, aber ich hatte eine solche Situation und möchte nur meine Lösung teilen. Alle obigen Antworten funktionieren einwandfrei. Wenn Sie jedoch einen Code wie den in data.table verketteten Syntax haben, wird dies zu einer Herausforderung. zB hatte ich so ein Problem.

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

Ich habe die meisten der oben genannten Vorschläge ausprobiert und sie haben nicht funktioniert. aber ich habe herausgefunden, dass sie nach dem Komma innerhalb geteilt werden können []. Splitting bei ][nicht funktioniert.

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
quelle
Könnte es sein, dass Sie die Frage, die Sie zu beantworten versuchten, verwechselt haben? Dies hat nichts mit der Frage von OP zu tun.
Zerweck
Es hat. Die Hauptfrage ist, wie eine Codezeile in mehrere Zeilen aufgeteilt wird. Ich habe dies anhand eines anderen Beispiels demonstriert, das etwas komplexer ist als die ursprüngliche Frage. Ich dachte, es sei notwendig, es zu posten, weil ich viel Zeit damit verbracht habe, herauszufinden, wie man diesen bestimmten Code aufteilt. Und ich denke, es hilft jemandem mit einem ähnlichen Problem.
M Terry
Das Problem des OP bestand darin, dass das Teilen eines Zeichenvektors mit einem Zeilenumbruch den Zeilenumbruch in den Zeichenvektor einschließt. Ihre Antwort ist nur spezifisch für die Syntax von data.table
zerweck
Als Beispiel für die Aufteilung einer Codezeile auf mehrere Zeilen
M Terry