Dividir código en varias líneas en un script R


Quiero dividir una línea en un script R sobre varias líneas (porque es demasiado larga). ¿Cómo hago eso?

Específicamente, tengo una línea como

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

¿Es posible dividir el camino largo en múltiples líneas? He intentado

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

Con la tecla return al final de la primera línea; pero eso no funciona.

Gracias.

 105
Author: smci, 2011-06-13

5 answers

No estás dividiendo código en múltiples líneas, sino un único identificador. Hay una diferencia.

Para su problema, intente

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

Que también ilustra que está perfectamente bien romper código a través de múltiples líneas.

 83
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-13 13:26:00

Bah, los comentarios son demasiado pequeños. De todos modos, @Dirk tiene mucha razón.

R no necesita que se le diga que el código comienza en la siguiente línea. Es más inteligente que Python; -) y continuará leyendo la siguiente línea siempre que considere la instrucción como "no terminada". En realidad, en su caso también fue a la siguiente línea, pero R toma el retorno como un carácter cuando se coloca entre "".

Tenga en cuenta que tendrá que asegurarse de que su código no esté terminado. Comparar

a <- 1 + 2
+ 3

Con

a <- 1 + 2 +
3

Por lo tanto, cuando se extiende el código sobre varias líneas, usted tiene que asegurarse de que R sabe que algo está viniendo, ya sea por:

  • dejando un paréntesis abierto, o
  • terminando la línea con un operador

Cuando hablamos de cadenas, esto todavía funciona, pero debes tener un poco de cuidado. Puede abrir las comillas y R seguirá leyendo hasta que lo cierre. Pero cada carácter, incluyendo la nueva línea, será visto como parte de la cadena:

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.

Eso es la razón por la que en este caso, su código no funcionó: una ruta no puede contener un carácter de nueva línea (\n). Así que es también por eso que es mejor utilizar la solución con paste() o paste0() Dirk propuesto.

 117
Author: Joris Meys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-19 03:13:07

El método de Dirk anterior funcionará absolutamente, pero si está buscando una manera de traer una cadena larga donde es importante preservar los espacios en blanco/estructura (ejemplo: una consulta SQL usando RODBC), hay una solución de dos pasos.

1) Introduzca la cadena de texto a través de varias líneas

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

2) R introducirá un montón de caracteres \n. Despojarlos con strwrap(), que destruye los espacios en blanco, según la documentación :

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

Diciéndole a strwrap que envuelva su texto a una fila muy, muy larga, se obtiene un vector de carácter único sin espacios en blanco/caracteres de nueva línea.

 29
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-14 18:09:05

Para ese caso particular hay file.path:

File <- file.path("~", 
  "a", 
  "very", 
  "long",
  "path",
  "here",
  "that",
  "goes",
  "beyond",
  "80",
  "characters",
  "and",
  "then",
  "some",
  "more")
setwd(File)
 12
Author: G. Grothendieck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-08 21:06:43

En el mac puedes pulsar:

⎇ and return

Esto le permitirá introducir un comando sobre varias líneas y R no debería preocuparse.

 -4
Author: Stevancw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-12 16:06:33