web-dev-qa-db-fra.com

Scinder le code sur plusieurs lignes dans un script R

Je veux fractionner une ligne dans un script R sur plusieurs lignes (parce que c'est trop long). Comment je fais ça?

Plus précisément, j'ai une ligne telle que

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

Est-il possible de diviser le long chemin sur plusieurs lignes? j'ai essayé

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

avec la touche return à la fin de la première ligne; mais ça ne marche pas.

Merci.

117
Curious2learn

Vous ne divisez pas code sur plusieurs lignes, mais plutôt un identifiant unique . Il y a une différence.

Pour votre problème, essayez

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

ce qui illustre également le fait qu'il est parfaitement correct de casser le code sur plusieurs lignes.

93
Dirk Eddelbuettel

Bah, les commentaires sont trop petits. Quoi qu'il en soit, @Dirk a très raison.

R n'a pas besoin d'être informé que le code commence à la ligne suivante. Il est plus intelligent que Python ;-) et continuera simplement à lire la ligne suivante chaque fois qu’il considère l’instruction comme "non terminée". En fait, dans votre cas, il est également passé à la ligne suivante, mais R prend le retour comme un caractère lorsqu'il est placé entre "".

Attention, vous devrez vous assurer que votre code n'est pas fini. Comparer

a <- 1 + 2
+ 3

avec 

a <- 1 + 2 +
3

Ainsi, lorsque vous étalez du code sur plusieurs lignes, vous devez vous assurer que R sait que quelque chose arrive, soit en:

  • en laissant un support ouvert, ou
  • terminer la ligne avec un opérateur

Lorsque nous parlons de chaînes, cela fonctionne toujours, mais vous devez être prudent. Vous pouvez ouvrir les guillemets et R lira jusqu'à ce que vous le fermiez. Mais chaque caractère, y compris la nouvelle ligne, sera considéré comme faisant partie de la chaîne:

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.

C'est la raison pour laquelle dans ce cas, votre code n'a pas fonctionné: un chemin ne peut pas contenir de caractère de nouvelle ligne (\n). C'est donc aussi pourquoi vous feriez mieux d'utiliser la solution avec paste() ou paste0() Dirk proposé. 

125
Joris Meys

La méthode de Dirk ci-dessus fonctionnera absolument, mais si vous cherchez un moyen de créer une longue chaîne où il est important de préserver les espaces/structure (exemple: une requête SQL utilisant RODBC), il existe une solution en deux étapes.

1) Amenez la chaîne de texte sur plusieurs lignes

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

2) R introduira un groupe de caractères \n. Dénudez-les avec strwrap(), qui détruit les espaces, selon la documentation :

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

En demandant à strwrap de placer votre texte sur une très, très longue ligne, vous obtenez un vecteur à caractère unique sans caractère d'espacement ni de nouvelle ligne.

30
Andrew

Pour ce cas particulier, il y a file.path:

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

En tant que nouvel utilisateur de R, je remarque qu'aucune des réponses ci-dessus n'a répondu à la question !! La réponse portait sur un morceau de code et plusieurs exemples portaient sur la lecture de données. Pourtant, voici un morceau de code que j'ai copié et collé dans la console Rstudio et les résultats obtenus:

> poisson.lik <- function(lambda,Trades,Trades_Freq){
+     n <- length(Trades)
+     logl <- sum(Trades*Trades_Freq)*log(lambda) - n*lambda  – 
Error: unexpected input in:
"    n <- length(Trades)
    logl <- sum(Trades*Trades_Freq)*log(lambda) - n*lambda  –"
>     sum(log(Trades_Freq))
Error: object 'Trades_Freq' not found
>     return(-logl)
Error: object 'logl' not found
> }
Error: unexpected '}' in "}"

J’ai essayé d’ajouter une virgule à la fin de -, j’ai aussi essayé de taper le retour et de laisser l’embout commencer sur une nouvelle ligne. Rien de tout cela n'a fonctionné. Incroyablement, j'ai dû diviser la ligne en deux parties sous la forme d'un patch, comme indiqué ci-dessous, afin de la faire fonctionner! Je ne peux tout simplement pas croire que c’est un problème R.

> poisson.lik <- function(lambda,Trades,Trades_Freq){
+     n <- length(Trades)
+     logl1  <- sum(Trades*Trades_Freq)*log(lambda) - n*lambda 
+     logl2  <-  - sum(log(Trades_Freq)) 
+     logl <- logl1 + logl2
+     return(-logl)
+ }
> 
0
Go C