Διαδρομές
/
R
R
/
Ύλη
/
Συμβολοσειρές
Συ

Συμβολοσειρές σε R

2 ασκήσεις

Σχετικά με την έννοια Συμβολοσειρές

Ιστορικό

Μια συμβολοσειρά είναι ένα κομμάτι κειμένου ανάμεσα σε εισαγωγικά.

mystring <- "some text"
mystring
#> [1] "some text"
typeof(mystring)
#> [1] "character"

Δυστυχώς, η ορολογία μπορεί να μπερδέψει προγραμματιστές που είναι εξοικειωμένοι με άλλες γλώσσες.

Αν και ο type είναι character, η R δεν κάνει καμία διάκριση ανάμεσα σε ένα μεμονωμένο γράμμα (που σε αρκετές άλλες γλώσσες ονομάζεται char, αλλά όχι στην R) και σε μια μεγάλη συμβολοσειρά. Και τα δύο αποτελούν ένα μεμονωμένο στοιχείο και μπορούν να γραφτούν με μονά ' ' ή διπλά " " εισαγωγικά, αδιακρίτως.

Ο οδηγός στυλ συνιστά να χρησιμοποιείς διπλά εισαγωγικά, εκτός αν θέλεις να βάλεις διπλά εισαγωγικά μέσα στη συμβολοσειρά χωρίς να χρησιμοποιήσεις χαρακτήρες διαφυγής.

str2 <- 'String with "quotes"'  # convenience format
str2
#> [1] "String with \"quotes\""    # standard format

Ένα character vector είναι λοιπόν ένα διάνυσμα συμβολοσειρών, με κάθε συμβολοσειρά ως ένα μεμονωμένο στοιχείο.

s <- c("some", "strings")
s
#> [1] "some"    "strings"
length(s)
#> [1] 2
length(s[1])  # the number of vector elements, not the string length
#> [1] 1

nchar(s[1])  # the number of characters in the string "some"
#> [1] 4

Στο παραπάνω παράδειγμα, το length(s[1]) ισοδυναμεί με το length("some"): τον αριθμό των στοιχείων του διανύσματος, όχι το μήκος της συμβολοσειράς.

Ο χειρισμός μιας μεμονωμένης συμβολοσειράς είναι προφανώς εφικτός, όπως με τη nchar() στο παραπάνω παράδειγμα, αλλά απαιτεί ειδικές συναρτήσεις που θα συζητηθούν παρακάτω.

Διαφυγή

Όπως είδαμε παραπάνω, κάποιοι χαρακτήρες στίξης χρειάζονται "διαφυγή", βάζοντας μπροστά τους μια ανάστροφη κάθετο \.

Η λίστα δεν θα εκπλήξει τους περισσότερους έμπειρους προγραμματιστές, καθώς το θέμα είναι αρκετά τυποποιημένο ανάμεσα στις γλώσσες.

Εκτός από τα εισαγωγικά (όπως φαίνεται παραπάνω), η λίστα περιλαμβάνει χαρακτήρες αλλαγής γραμμής \n, στηλοθέτες \t, την ανάστροφη κάθετο \\ και σύμβολα Unicode που αρχίζουν με \U ή \u.

Για να αποφύγεις τη χρήση πολλών χαρακτήρων διαφυγής, μπορείς να ορίσεις raw strings μέσα σε r"( )":

r"(raw "string")"
#> [1] "raw \"string\""

Για raw strings που περιέχουν παρενθέσεις ( ), υπάρχουν πολλές άλλες συντακτικές επιλογές.

Τοπικές ρυθμίσεις

Κάθε έκδοση της R που υποστηρίζεται σήμερα κωδικοποιεί τις συμβολοσειρές σε UTF-8, οπότε υποστηρίζονται οι περισσότερες γλώσσες του κόσμου.

"आधुनिक मानक हिन्दी"
#> [1] "आधुनिक मानक हिन्दी"

Επιπλέον, πολλές συναρτήσεις της R λαμβάνουν υπόψη τους το locale και προσπαθούν να ακολουθήσουν τις τοπικές συμβάσεις για την ταξινόμηση συμβολοσειρών, τη μετατροπή σε κεφαλαία/πεζά, τις ημερομηνίες και τις ώρες κ.λπ.

Το πρόγραμμα σπουδών θα δείχνει παραδείγματα κυρίως για τα αγγλικά των ΗΠΑ: και επειδή αυτή είναι μια συνηθισμένη προεπιλογή, και επειδή οι συγγραφείς του προγράμματος σπουδών τυγχάνει να κατοικούν στις ΗΠΑ.

Οι τοπικές ρυθμίσεις είναι ένα σύνθετο θέμα, οπότε ψάξε για τεκμηρίωση που ταιριάζει στη δική σου περίπτωση.

Συναρτήσεις συμβολοσειρών

Τα περισσότερα πράγματα είναι εφικτά στη βασική R, αλλά πολλοί προγραμματιστές βρίσκουν την υποστήριξη για χειρισμό συμβολοσειρών αρκετά περιορισμένη και μπερδεμένη.

Ευτυχώς, υπάρχουν τα πακέτα του tidyverse, που είναι πολύ πιο διαισθητικά, ευέλικτα και συνεπή μεταξύ τους.

Βασική R

Υπάρχει ακόμη πολύς παλιός κώδικας που χρησιμοποιεί συναρτήσεις συμβολοσειρών παλιού στυλ. Αυτό περιλαμβάνει τις περισσότερες λύσεις της κοινότητας στο Exercism.

Επιπλέον, για μικρές εργασίες μπορεί να είναι χρήσιμο να χρησιμοποιήσεις ενσωματωμένες συναρτήσεις αντί να εισάγεις μια μεγάλη βιβλιοθήκη. Οι συντηρητές του track R τείνουν να ακολουθούν αυτή την προσέγγιση όταν γράφουν υποδειγματικές λύσεις για να επικυρώνουν τις ασκήσεις στο αποθετήριο GitHub μας.

Επομένως, αξίζει ακόμα να μάθεις κάτι από τις παλιές προσεγγίσεις.

Οι παρακάτω συναρτήσεις παρουσιάζονται στην απλούστερη μορφή τους, αλλά οι περισσότερες έχουν και προαιρετικά ορίσματα. Δες την τεκμηρίωση για λεπτομέρειες.

nchar

Επιστρέφει τον αριθμό των χαρακτήρων σε μια συμβολοσειρά.

nchar("string")
#> [1] 6

nchar("Hrōðgār") # a person in Beowulf, written in Old English
#> [1] 7

Το (περίπλοκο!) θέμα του τι σημαίνει "χαρακτήρας" ξεπερνά το πεδίο μας. Σημείωσε απλώς δύο σημεία στα παραπάνω παραδείγματα:

  • Αν και υλοποιούνται εσωτερικά σε C, οι συμβολοσειρές στην R δεν τερματίζονται με \0 (κάτι που θα πρόσθετε 1 στο μήκος).
  • Οι χαρακτήρες Unicode πολλαπλών byte αντιμετωπίζονται όπως θα περίμενες/ήλπιζες. Το "Hrōðgār" έχει 7 χαρακτήρες (που ονομάζονται επίσης "rune" ή "σημεία κώδικα"), αλλά χρειάζεται 10 byte για την αποθήκευσή του.

Πρόσεχε τι περνάς στη nchar. Τα αποτελέσματα μπορεί να είναι ακόμα απρόβλεπτα για τιμές που δεν είναι character, αν και αυτό έχει βελτιωθεί στις πρόσφατες εκδόσεις της R.

grep

Αναζητά ένα μοτίβο σε ένα διάνυσμα συμβολοσειρών και επιστρέφει τις θέσεις όπου υπάρχει αντιστοιχία.

grep("Jav", c("Java", "Python", "Javascript"))
#> [1] 1 3
paste και paste0

Συνδυάζει έναν αυθαίρετο αριθμό συμβολοσειρών σε μία συμβολοσειρά.

Προαιρετικά, μπορείς να ορίσεις έναν διαχωριστικό για τη paste: η προεπιλογή είναι ένα κενό.

Η paste0(v) είναι ισοδύναμη με την paste(v, sep = "").

paste("bits", "of", "a", "string")
#> [1] "bits of a string"
paste0("bits", "of", "a", "string")
#> [1] "bitsofastring"
sprintf

Για λεπτότερο έλεγχο στη σύνθεση συμβολοσειρών, η R αντιγράφει τη συνάρτηση sprintf από τη C (και από αρκετές μεταγενέστερες γλώσσες: η Wikipedia απαριθμεί περίπου 30).

r <- 5.3
pi <- 3.14159
sprintf("A circle of radius %.1f has area %.2f", r, pi * r^2)
#> [1] "A circle of radius 5.3 has area 88.25"
trimws

Τα κενά στην αρχή ή/και στο τέλος μπορούν να αφαιρεθούν με τη trimws():

s <- "    messy string   "
trimws(s)
#> [1] "messy string"

Υπάρχει μια παράμετρος which = "left" (ή "right") για να αποφύγεις να κόψεις και τις δύο άκρες.

substr

Λειτουργεί σε μία μόνο συμβολοσειρά και επιστρέφει μια υποσυμβολοσειρά ανάμεσα σε δύο (συμπεριλαμβανόμενα) όρια.

substr("Exercism", 5, 7)
#> [1] "cis"
strsplit

Χωρίζει μια συμβολοσειρά σε μια λίστα της R, με βάση μια συμβολοσειρά διαχωρισμού. Ο διαχωριστικός είναι υποχρεωτικός (χωρίς προεπιλογή), αλλά μπορεί να είναι μια κενή συμβολοσειρά.

strsplit("R, Python, Julia", ", ")
[[1]]
#> [1] "R"      "Python" "Julia" 

strsplit("Exercism", "")
[[1]]
#> [1] "E" "x" "e" "r" "c" "i" "s" "m"

Οι λίστες θα καλυφθούν σε μια ξεχωριστή έννοια. Αν δεν έχεις φτάσει ακόμα σε εκείνο το σημείο του προγράμματος σπουδών, αρκεί για την ώρα να ξέρεις ότι η συνάρτηση unlist() θα μετατρέψει (σε αυτή την περίπτωση) μια λίστα σε διάνυσμα.

unlist(strsplit("Exercism", ""))
#> [1] "E" "x" "e" "r" "c" "i" "s" "m"
regexpr και regexpr

Συντομογραφία του "regular expression", αυτές οι συναρτήσεις αναζητούν εμφανίσεις ενός μοτίβου σε μια συμβολοσειρά και επιστρέφουν μια λίστα με (δυνητικά) χρήσιμα δεδομένα. Αναφέρονται μόνο για λόγους πληρότητας: υπάρχουν καλύτερες επιλογές!

Η regexpr επιστρέφει μόνο την πρώτη εμφάνιση, η gregexpr επιστρέφει όλες τις εμφανίσεις ("g" από το "global", καθολική αναζήτηση).

Όπως υποδηλώνουν τα ονόματα, το μοτίβο μπορεί να είναι ένα regex, το οποίο θα καλυφθεί σε μια επόμενη έννοια.

Advanced

Γιατί αυτές οι παλιές συναρτήσεις συμβολοσειρών μοιάζουν με εντολές του κελύφους του Unix;

Αν και η R δημιουργήθηκε το 1993, σχεδιάστηκε ώστε να είναι σε μεγάλο βαθμό συμβατή προς τα πίσω με τη γλώσσα S.

Η S σχεδιάστηκε στα Bell Labs, εμφανιζόμενη για πρώτη φορά το 1976. Τα Bell Labs ήταν επίσης υπεύθυνα για το Unix (από το 1969) και τη γλώσσα C (1972).

Τι ομάδα κι αυτή, από μια τόσο παλαιότερη εποχή! Μπορούμε μόνο να υποθέσουμε ότι μιλούσαν μεταξύ τους και αντάλλασσαν ιδέες.

Tidyverse

Για να είμαστε επιεικείς, θα λέγαμε ότι οι συναρτήσεις συμβολοσειρών παλιού στυλ δεν είναι ό,τι καλύτερο έχει να προσφέρει η R (υπάρχουν και λιγότερο επιεικείς απόψεις).

Για να βελτιωθεί η κατάσταση, η βιβλιοθήκη stringr αναπτύσσεται από το 2009 και τώρα αποτελεί βασικό μέρος της συλλογής Tidyverse.

Εισήγαγέ την στον χώρο ονομάτων σου με library(stringr) ή library(tidyverse).

Μερικά βασικά χαρακτηριστικά:

  • Όλα τα ονόματα συναρτήσεων έχουν πρόθεμα str_ και προσπαθούν να κάνουν σαφή τον σκοπό τους.
  • Η σειρά των ορισμάτων προσπαθεί να είναι συνεπής, με τα δεδομένα εισόδου ως πρώτο όρισμα.
  • Οι είσοδοι μπορούν να κυμαίνονται από μία μεμονωμένη συμβολοσειρά έως πολύπλοκες δομές δεδομένων. Οι συναρτήσεις θα προσπαθήσουν να προσαρμοστούν και να κάνουν το πιο λογικό.

Όπως όλα τα πακέτα του Tidyverse, το stringr έχει καλή τεκμηρίωση, συνήθως γραμμένη από τον δημιουργό (ή τους δημιουργούς) του πακέτου.

Υπάρχουν δεκάδες συναρτήσεις διαθέσιμες στο stringr και συχνά έχουν ποικιλία προαιρετικών ορισμάτων. Αυτό μπορεί να είναι λίγο συντριπτικό στην αρχή, οπότε η τεκμηρίωση είναι ο φίλος σου.

Σκέψου τι θέλεις να βάλεις μέσα (μία συμβολοσειρά; ένα διάνυσμα; κάτι πιο πολύπλοκο;) και τι θέλεις να πάρεις έξω.

Πιθανότατα υπάρχει ένας εύκολος τρόπος να κάνεις ό,τι θέλεις, αρκεί να βρεις τη σωστή συνάρτηση και τα σωστά ορίσματα.

Παρέκβαση: μια γρήγορη εισαγωγή στους σωλήνες

Η χρήση των σωλήνων |> για τη σύνδεση συναρτήσεων θα συζητηθεί με περισσότερες λεπτομέρειες σε άλλα μέρη του προγράμματος σπουδών.

Για την ώρα, είναι χρήσιμο να ξέρεις ότι:

  • Ένα αποτέλεσμα από τα αριστερά του σωλήνα γίνεται το πρώτο όρισμα στη συνάρτηση προς τα δεξιά (όπου το "δεξιά" αγνοεί τις προαιρετικές αλλαγές γραμμής).
  • Τυχόν υπόλοιπα ορίσματα μπορούν να συμπεριληφθούν στην κλήση της συνάρτησης.
  • Στην R, πρέπει να κατευθύνουμε τον σωλήνα προς μια κλήση συνάρτησης, όχι απλώς προς ένα όνομα, οπότε απαιτούνται πάντα παρενθέσεις (αυτό διαφέρει από κάποιες άλλες γλώσσες).

Το παρακάτω παράδειγμα δείχνει τη σύνταξη. Οι επιμέρους συναρτήσεις θα συζητηθούν αργότερα.

library(stringr)

"Monday-25-February" |> 
  str_split("-") |>     
  unlist() |>               # [1] "Monday"   "25"       "February"
  str_sub(1, 3) |>          # [1] "Mon" "25"  "Feb"
  str_to_upper() |>         # [1] "MON" "25"  "FEB"
  str_flatten(collapse = ", ")
#> [1] "MON, 25, FEB"
Διαχείριση μηκών

Η str_length μετρά σημεία κώδικα (παρόμοια με τη nchars).

Διάφορες άλλες συναρτήσεις χειρίζονται τα κενά, όπως οι str_trim() και str_squish(). Αυτή είναι συχνά μια ζωτικής σημασίας εργασία καθαρισμού στην αρχή κάθε έργου επιστήμης δεδομένων.

# The first 3 kernels in JuPyteR notebooks:
str_length(c("Julia", "Python", "R"))           #> [1] 1 6 5
#> [1] 5 6 1
str_pad(c("Julia", "Python", "R"), 8, "right")  # add spaces if necessary
#> [1] "Julia   " "Python  " "R       "

str_trim("Julia    Python    R    ")   # remove leading & trailing whitespace
#> [1] "Julia    Python    R"
str_squish("Julia   Python  R    ")  # trim, collapse multiple spaces 
#> [1] "Julia Python R"
Υποσύνολα συμβολοσειρών

Η συνάρτηση str_sub(string, start, end) επιστρέφει την υποσυμβολοσειρά από το start έως το end (συμπεριλαμβανόμενα), ενώ η str_sub_all() μπορεί να λειτουργήσει σε πολλές συμβολοσειρές.

Υπάρχει μεγάλη ευελιξία. Οι start και end έχουν ως προεπιλογή τον πρώτο και τον τελευταίο χαρακτήρα αντίστοιχα. Μπορούν να είναι διανύσματα θέσεων. Σε ευχάριστη αντίθεση με τη χρήση θέσεων στα διανύσματα, οι αρνητικές τιμές μετρούν από το τέλος της συμβολοσειράς προς τα πίσω, όπως στην Python.

s <- "abcdefgh"
str_sub(s, 2, 4)
#> [1] "bcd"
str_sub(s, 5)
#> [1] "efgh"
str_sub(s, -3, -2)
#> [1] "fg"
str_sub(s, c(1, 4), c(2, 5))
#> [1] "ab" "de"
str_sub(s, c(1, 4, 6), c(2, 5, -1))
#> [1] "ab"  "de"  "fgh"

s |> str_sub(2, 4) # these functions are designed for pipes
#> [1] "bcd"

# str_sub_all takes vector input, gives list output
str_sub_all(c(s, "ijklmnop"), c(1, 4, 6), c(2, 5, -1))
[[1]]
#> [1] "ab"  "de"  "fgh"

[[2]]
#> [1] "ij"  "lm"  "nop"
Συνένωση συμβολοσειρών

Η str_flatten μετατρέπει ένα διάνυσμα χαρακτήρων σε μία συμβολοσειρά. Το όρισμα collapse παρεμβάλλεται ανάμεσα σε κάθε στοιχείο και έχει ως προεπιλογή το "".

c("R", "Julia", "Python") |> str_flatten()
#> [1] "RJuliaPython"
c("R", "Julia", "Python") |> str_flatten(collapse = " - ")
#> [1] "R - Julia - Python"

Η str_c μετατρέπει πολλά διανύσματα χαρακτήρων σε ένα διάνυσμα χαρακτήρων, με ανακύκλωση όπου χρειάζεται.

str_c(LETTERS[1:8], 1:8, sep = ":")
#> [1] "A:1" "B:2" "C:3" "D:4" "E:5" "F:6" "G:7" "H:8"

Η str_glue φέρνει την απλή παρεμβολή συμβολοσειρών στην R. Οι εκφράσεις μέσα σε άγκιστρα { } ερμηνεύονται και αντικαθίστανται από την αναπαράστασή τους ως κείμενο.

Αν δοθούν πολλές συμβολοσειρές εκφράσεων, θα συνενωθούν επίσης όπως στη str_flatten. Οι συμβολοσειρές μπορούν επίσης προαιρετικά να καθαριστούν από κενά στην αρχή/στο τέλος.

r <- 5.3
pi <- 3.14159
str_glue("A circle of radius {r} has area {pi * r^2}")
A circle of radius 5.3 has area 88.2472631

Αν και η str_glue είναι ευέλικτη (και αρκετά περίπλοκη), μια ακόμα ευρύτερη γκάμα δυνατοτήτων είναι διαθέσιμη στη βιβλιοθήκη glue που βρίσκεται από κάτω.

Διαχωρισμός συμβολοσειρών

Μια πολύ συνηθισμένη χρήση της R είναι να μεταμορφώνεις ακατάστατα δεδομένα σε μια συνεπή μορφή για ανάλυση. Για να βοηθηθείς, υπάρχουν αρκετοί τρόποι να χωρίσεις κείμενο σε υποσυμβολοσειρές.

Η str_split_1 είναι η απλούστερη: μετατρέπει μία συμβολοσειρά σε διάνυσμα τμημάτων, χωρισμένων σε ένα μοτίβο που ορίζεις (δεν υπάρχει προεπιλεγμένο μοτίβο).

s <- "R Julia Python"
str_split_1(s, " ")
#> [1] "R"      "Julia"  "Python"

Η str_split_i παίρνει ένα διάνυσμα χαρακτήρων και μια θέση n και επιστρέφει ένα διάνυσμα με την n-οστή υποσυμβολοσειρά κάθε συμβολοσειράς εισόδου.

s2 <- c(s, "C Kotlin, F#")  #> [1] "R Julia Python" "C Kotlin, F#"
str_split_i(s2, " ", 2)  # 2nd element of each
#> [1] "Julia"   "Kotlin,"

Η str_split παίρνει ένα διάνυσμα χαρακτήρων και επιστρέφει μια λίστα από διανύσματα. Υπάρχει μια έννοια για τις λίστες στο πρόγραμμα σπουδών μας, που εξηγεί την έξοδο.

str_split(s2, " ")
[[1]]
#> [1] "R"      "Julia"  "Python"

[[2]]
#> [1] "C"       "Kotlin," "F#"     

Υπάρχει επίσης η str_split_fixed, που επιστρέφει μια μήτρα. Οι μήτρες θα καλυφθούν σε μια επόμενη έννοια.

Αντιστοίχιση συμβολοσειρών

Για να συγκρίνεις ολόκληρη τη συμβολοσειρά, η str_equal() μπορεί να χρησιμοποιήσει διάφορους ορισμούς της "ισότητας". Στην απλούστερη περίπτωση, η προεπιλογή κάνει διάκριση πεζών-κεφαλαίων, αλλά μπορεί να αλλάξει. Οι τοπικές ρυθμίσεις και το Unicode δημιουργούν πολλές ακόμα δυνατότητες.

str_equal("Odin", "odin")
#> [1] FALSE
str_equal("Odin", "odin", ignore_case = TRUE)
#> [1] TRUE

Υπάρχουν πολλές άλλες συναρτήσεις, που θα συζητηθούν με περισσότερες λεπτομέρειες στην έννοια των κανονικών εκφράσεων.

Μετασχηματισμός συμβολοσειρών

Κάποιες γλώσσες (κυρίως ευρωπαϊκές) διακρίνουν ανάμεσα σε ΚΕΦΑΛΑΙΑ και πεζά γράμματα. Υπάρχει ένα σύνολο συναρτήσεων του stringr για τη μεταξύ τους μετατροπή, με τρόπους κατάλληλους για κάθε τοπική ρύθμιση:

  • str_to_lower()
  • str_to_upper()
  • str_to_title() : το πρώτο γράμμα κάθε λέξης σε κεφαλαίο
  • str_to_sentence() : το πρώτο γράμμα της πρότασης σε κεφαλαίο
str_to_upper("elixir")    # defaults to locale = "en"
#> [1] "ELIXIR"
str_to_upper("ελληνικά")  # infers Greek
#> [1] "ΕΛΛΗΝΙΚΆ"

str_to_title("the cat sat on the mat")
#> [1] "The Cat Sat On The Mat"
str_to_sentence("the cat sat on the mat")
#> [1] "The cat sat on the mat"

Για αντικατάσταση υποσυμβολοσειρών με βάση την αντιστοίχιση μοτίβου, η str_replace() αλλάζει την πρώτη εμφάνιση του μοτίβου και η str_replace_all() αλλάζει όλες τις εμφανίσεις.

Για αντικατάσταση υποσυμβολοσειρών με βάση τη θέση των χαρακτήρων, υπάρχει μια μορφή εκχώρησης της str_sub().

 s <- "abcde"
str_sub(s, 3, 4) <- "yz"
s
#> [1] "abyze"
Διάφορα

Η str_dup δημιουργεί διπλότυπα και η str_unique αφαιρεί τα διπλότυπα.

Από προεπιλογή, η str_dup δεν έχει διαχωριστικό, αλλά μπορείς να ορίσεις ένα.

str_dup("xyz", 4, sep = ", ")
#> [1] "xyz, xyz, xyz, xyz"

Η str_unique είναι επέκταση της unique(). Και οι δύο αφαιρούν τα διπλότυπα από ένα διάνυσμα, αλλά η συνάρτηση του stringr μπορεί επίσης να χειριστεί τη διάκριση πεζών-κεφαλαίων και διάφορες αντιστοιχίσεις ανάλογα με την τοπική ρύθμιση.

inp <- c("some", "strings", "Some", "Strings")
str_unique(inp)
#> [1] "some"    "strings" "Some"    "Strings"
str_unique(inp, ignore_case = TRUE)
#> [1] "some"    "strings"
Advanced

Η βιβλιοθήκη stringr βασίζεται στη βιβλιοθήκη stringi με συναρτήσεις χαμηλότερου επιπέδου.

Αν έχεις ειδικές ανάγκες που δεν έχουν ήδη συζητηθεί παραπάνω, τότε:

  1. Κοίταξε την τεκμηρίωση του stringr, που καλύπτει περισσότερες επιλογές από όσες μπορούμε να αναφέρουμε ακόμα και σε αυτό το εκτενές έγγραφο έννοιας.
  2. Κοίταξε την τεκμηρίωση του stringi, που περιγράφει πολλές ακόμα λειτουργίες.
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Συμβολοσειρές

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 1 ακόμη άσκηση για να εξασκηθείς στην έννοια Συμβολοσειρές