2
votes

Une alternative à scan () en R (ici-document style)

XXX

Ce qui me donne correctement:

R script here
â‹®
bla <- <SOMETHING - BEGIN>
line1
line2
line3
<SOMETHING - END>
â‹®
more R script here

Cependant, il y a plusieurs problèmes. Tout d'abord, il est en retrait. Je n'ai pas à le faire, mais toute fonctionnalité d'indentation automatique le fera simplement revenir pour être aligné (ce que j'utilise couramment). Deuxièmement, cela nécessite des codes d'échappement si je souhaite utiliser le symbole de guillemet double par exemple.

Existe-t-il un moyen de faire quelque chose de similaire à la méthode Here-Document ( ), dans les scripts R?

J'utilise RStudio comme IDE, fonctionnant sous Windows. De préférence, il y aurait un moyen indépendant de la plate-forme de le faire.


EDIT

Avez-vous besoin d'avoir le texte dans le script R?

Oui.

Un exemple de ce que je veux faire:

> bla
[1] "line1" "line2" "line3"

Là où l'exigence, encore une fois, est que je puisse tapez librement sans vous soucier de l'indentation automatique pour faire avancer les lignes, et pas besoin de vous soucier des codes d'échappement lorsque vous tapez des choses comme " .


4 commentaires

data.table :: fread () .. separator = \ n répondra probablement à vos besoins? Sinon, veuillez fournir des exemples de données qui reproduisent vos problèmes.


Je mettrais simplement le texte dans un fichier texte différent, puis je le lisais avec readLines () ou des équivalents dans d'autres packages. Avez-vous besoin d'avoir le texte dans le script R ?


@Wimpel fread () est pour la lecture d'un fichier. Je veux lire le script lui-même.


@JBGruber Je veux avoir le texte dans le script, oui.


3 Réponses :


1
votes

Si la création d'un document Rmarkdown au lieu d'un script R est une option, nous pourrions utiliser le moteur knitr cat

---
title: "Untitled"
output: html_document
---

```{cat engine.opts=list(file='foo')}
line1
line2
"line3"
'line4'
```

```{r}
bla <- readLines("foo")
bla
```


0 commentaires

2
votes

Les deux problèmes peuvent être résolus avec la fonction scan et deux petites astuces, je pense:

scan(text = '
line1
"line2" uses quotation mark
line3
', what = character(), sep = "\n")

Read 3 items
[1] "line1"                         "\"line2\" uses quotation mark"
[3] "line3"  

Lorsque vous mettez les guillemets dans une ligne qui leur est propre , vous n'avez pas de problème d'indentation automatique (testé avec RStudio). Si vous n'avez que des guillemets doubles dans le texte, vous pouvez utiliser des guillemets simples pour commencer et terminer votre objet caractère. Si vous avez des guillemets simples dans le texte, utilisez des guillemets doubles pour le caractère. Si vous avez les deux, vous devriez probablement utiliser la recherche et le remplacement pour les rendre uniformes.

J'ai également ajouté sep = "\ n" , donc chaque ligne est un élément du résultat vecteur de caractères.


2 commentaires

C'est également ce que j'avais à l'esprit, mais cela ne créerait-il pas un problème similaire si je souhaitais utiliser un guillemet simple dans mon texte?


Oui, ça le ferait. J'ai déjà modifié la réponse et ajouté cette ligne "Si vous avez les deux, vous devriez probablement utiliser la recherche et le remplacement pour les rendre uniformes." Les guillemets sont les seules choses dont vous auriez besoin pour échapper dans ce cas, donc je pense que c'est un inconvénient raisonnable. Mais, bien sûr, vous pouvez vérifier si quelqu'un d'autre propose une meilleure solution. Je ne le pense pas vraiment car cela semble être une caractéristique essentielle des scripts R.



1
votes

Depuis la version R 4.0, nous avons des chaînes brutes (Voir ?Quotes)

bla <- strsplit(bla, "\n")[[1]]
                      
#> [1] "line1"                  
#> [2] "line2"                  
#> [3] "\"line3\""              
#> [4] "'line4'"                
#> [5] "    Here is indentation"
#> [6] "Here is a backslash \\"

Notez bien que cela donne une seule chaîne, pas des éléments séparés. Nous pouvons le fractionner avec strsplit:

bla <- r"(line1
line2
"line3"
'line4'
    Here is indentation
Here is a backslash \
)"

#> [1] "line1\nline2\n\"line3\"\n'line4'\n    Here is indentation\nHere is a backslash \\\n"


0 commentaires