Dividi il codice su più righe in uno script R.


137

Voglio dividere una riga in uno script R su più righe (perché è troppo lunga). Come lo faccio?

In particolare, ho una linea come

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

È possibile dividere il percorso lungo su più righe? Provai

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

con returnchiave alla fine della prima riga; ma questo non funziona.

Grazie.

Risposte:


108

Non stai rompendo il codice su più righe, ma piuttosto un singolo identificatore . C'è una differenza.

Per il tuo problema, prova

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

il che dimostra anche che è perfettamente corretto suddividere il codice su più righe.


13
Grazie! Mi chiedevo se ci fosse un carattere che avrei potuto mettere alla fine della riga per indicare a R che il codice continua sulla riga successiva. Come "\" in Python. Tuttavia, la soluzione funziona bene per il problema specifico della continuazione delle stringhe.
Curious2learn,

14
o è meglio usare paste0 (...) che equivale a paste (..., sep = "")
gkcn

31
Ma paste0non esisteva ancora quando ho scritto la risposta 2+ anni fa.
Dirk Eddelbuettel,

Sembra che la modifica sia stata rifiutata e sono più o meno d'accordo con il rifiuto. La risposta è ancora corretta, ha il suo contesto e i commenti lo aggiornano.
Dirk Eddelbuettel,

Grazie per questo. Ho scoperto che è necessario utilizzare un plus per dividere le linee lunghe. Sono contento che la realtà sia molto più semplice!
Iain Samuel McLean Elder l'

144

Bah, i commenti sono troppo piccoli. Ad ogni modo, @Dirk ha ragione.

Non è necessario dire a R che il codice inizia alla riga successiva. È più intelligente di Python ;-) e continuerà a leggere la riga successiva ogni volta che considera l'affermazione come "non finita". In realtà, nel tuo caso è andato anche alla riga successiva, ma R prende il ritorno come personaggio quando è posizionato tra "".

Intendiamoci, dovrai assicurarti che il tuo codice non sia finito. Confrontare

a <- 1 + 2
+ 3

con

a <- 1 + 2 +
3

Quindi, quando si distribuisce il codice su più righe, è necessario assicurarsi che R sappia che sta arrivando qualcosa:

  • lasciando aperta una parentesi, oppure
  • termina la linea con un operatore

Quando parliamo di stringhe, funziona ancora, ma devi stare un po 'attento. È possibile aprire le virgolette e R continuerà a leggere fino a quando non lo si chiude. Ma ogni personaggio, inclusa la nuova riga, verrà visto come parte della stringa:

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.

Questo è il motivo per cui in questo caso il tuo codice non ha funzionato: un percorso non può contenere un carattere di nuova riga ( \n). Questo è anche il motivo per cui è meglio utilizzare la soluzione proposta paste()o paste0()proposta da Dirk.


Grazie Joris. Ho visto esempi simili a quelli che hai fornito nella documentazione online e ho provato anche per la stringa. Ho pensato che se non incontra una citazione di chiusura, continuerà alla riga successiva. Ma con la stringa non funziona, o meglio, come hai detto, funziona in modo diverso, nel senso che prende come carattere di nuova riga.
Curious2learn,

Grazie per aver chiarito perché a volte puoi dividere le linee con un segno più!
Iain Samuel McLean Elder l'

8
no, qui non è più intelligente del pitone. piuttosto che paste("~one",\n"/two")solo bisogno ("~one" \n "/two"). rilasciare le virgole e il paste. Non guardare smackdown linguistico. Uso entrambe le lingue ma ho sempre pensato che incollare fosse un fastidio.
Phil Cooper,

2
@JorisMeys Giusto, stavo cercando di correggere quell'errore. Usa le parentesi e non hai bisogno di "\" per la continuazione della linea. Mi piace perché puoi anche avere commenti su righe che non puoi fare con la sintassi "\" (ad esempio ("one"\n "/one.one" # some comment\n "/two")' esempi in stackoverflow.com/questions/10660435/…
Phil Cooper

1
leaving a bracket open, or ending the line with an operatorquesti due sono la strada da percorrere.
Sabato

35

Il metodo di Dirk sopra funzionerà assolutamente, ma se stai cercando un modo per inserire una lunga stringa in cui gli spazi bianchi / la struttura sono importanti da preservare (esempio: una query SQL che utilizza RODBC) c'è una soluzione in due passaggi.

1) Inserisci la stringa di testo su più righe

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

2) R introdurrà un mucchio di \npersonaggi. Striscia quelli con strwrap(), che distruggono gli spazi bianchi, secondo la documentazione :

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

Dicendo a strwrap di avvolgere il tuo testo in una riga molto, molto lunga, ottieni un singolo carattere vettoriale senza spazi bianchi / caratteri di nuova riga.


3
Mi piace di più questa risposta perché non devo scrivere tante virgole come con paste, se la stringa è piuttosto lunga. +1
user3032689

3
Tenere presente che strwrappotrebbe restituire il vettore di più stringhe anche se la stringa di origine non supera i 10k caratteri. Prova strwrap("a\n\nb"). Restituirà un vettore di lunghezza 3 ed è necessario incollarlo indietro paste(strwrap("a\n\nb"), collapse=" ")usando una colla per caratteri spaziali per comprimere il vettore.
Gedrox,

18

Per quel caso particolare c'è file.path:

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

0

So che questo post è vecchio, ma ho avuto una situazione come questa e voglio solo condividere la mia soluzione. Tutte le risposte sopra funzionano bene. Ma se hai un codice come quelli nella sintassi di concatenamento data.table diventa un po 'difficile. ad esempio ho avuto un problema come questo.

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

Ho provato la maggior parte dei suggerimenti sopra e non hanno funzionato. ma ho capito che possono essere divisi dopo la virgola all'interno []. Dividere a ][non funziona.

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]

Potrebbe essere che hai confuso la domanda a cui stavi cercando di rispondere? Questo non ha nulla a che fare con la domanda di OP.
zerweck,

Ha. La domanda principale è come dividere una riga di codice in più righe. Ho dimostrato che usando un altro esempio che è un po 'più complesso della domanda originale. Ho pensato che fosse necessario pubblicarlo perché ho trascorso molto tempo a cercare di capire come dividere quel particolare pezzo di codice. E immagino che aiuti qualcuno con un problema simile.
M Terry,

Il problema del PO era che la divisione di un vettore di carattere con un'interruzione di linea include l'interruzione di linea nel vettore di carattere. La tua risposta è specifica solo per la sintassi
data.table

Come esempio di divisione di una riga di codice su più righe
M Terry,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.