2  Ροή εργασιών: Bασικές αρχές

Έχετε πλέον κάποια εμπειρία στην εκτέλεση κώδικα R. Δεν σας δώσαμε πολλές λεπτομέρειες, προφανώς όμως έχετε καταλάβει τα βασικά, διαφορετικά θα είχατε πετάξει αυτό το βιβλίο με απογοήτευση! Η απογοήτευση είναι φυσιολογική όταν ξεκινάτε να προγραμματίζετε σε R, μιας και η ακρίβεια είναι σημαντική - ακόμη και ένας χαρακτήρας εκτός τόπου μπορεί να προκαλέσει σφάλματα. Αλλά ενώ θα περιμένετε να είστε μπερδεμένοι, παρηγορηθείτε με το ότι η εμπειρία αυτή είναι τυπική και προσωρινή: συμβαίνει σε όλους και ο μόνος τρόπος για να το ξεπεράσετε είναι να συνεχίσετε να προσπαθείτε.

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

2.1 Βασικές αρχές προγραμματισμού

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

1 / 200 * 30
#> [1] 0.15
(59 + 73 + 2) / 3
#> [1] 44.66667
sin(pi / 2)
#> [1] 1

Μπορείτε να δημιουργήσετε νέα αντικείμενα με τον τελεστή ανάθεσης <-:

x <- 3 * 4

Παρατηρήστε ότι η τιμή του x δεν τυπώνεται, απλά αποθηκεύεται. Εάν θέλετε να δείτε την τιμή του, πληκτρολογήστε x στην κονσόλα.

Μπορείτε να συνδυάσετε (combine) πολλαπλά στοιχεία σε ένα διάνυσμα με τη συνάρτηση c():

primes <- c(2, 3, 5, 7, 11, 13)

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

primes * 2
#> [1]  4  6 10 14 22 26
primes - 1
#> [1]  1  2  4  6 10 12

Όλες οι δηλώσεις στην R με τις οποίες μπορείτε να δημιουργήσετε αντικείμενα, γνωστές ως δηλώσεις ανάθεσης, έχουν την ίδια μορφή:

object_name <- value

Διαβάζοντας αυτόν τον κώδικα, μπορείτε να σκέφτεστε “το αντικείμενο object_name παίρνει τιμή value”.

Θα κάνετε πολλές αναθέσεις και ο τελεστής <- δεν είναι ό,τι πιο βολικό όταν πληκτρολογείτε. Μπορείτε να κερδίσετε χρόνο χρησιμοποιώντας την ακόλουθη συντόμευση πληκτρολογίου του RStudio: Alt + - (το σύμβολο του μείον). Παρατηρήστε ότι το RStudio περιβάλλει αυτόματα το <- με κενά, κάτι που γενικά είναι καλή πρακτική μορφοποίησης κώδικα. Ακόμη και σε μία καλή μέρα, το να διαβάζετε κώδικα μπορεί να είναι κουραστικό, οπότε κάντεένακαλόγιατονεαυτόσαας και χρησιμοποιήστε κενά.

2.2 Σχόλια

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

Τα σχόλια μπορούν να είναι χρήσιμα για να περιγράψουν εν συντομία τι κάνει ο παρακάτω κώδικας.

# Δημιουργήστε ένα διάνυσμα με πρώτους αριθμούς
primes <- c(2, 3, 5, 7, 11, 13)

# Πολλαπλασιάστε τους πρώτους αριθμούς με το 2
primes * 2
#> [1]  4  6 10 14 22 26

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

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

Το να καταλάβετε γιατί έγινε κάτι είναι πολύ πιο δύσκολο, αν όχι αδύνατο. Για παράδειγμα, η geom_smooth() έχει ένα όρισμα που ονομάζεται span, το οποίο ελέγχει την ομαλότητα της καμπύλης, με μεγαλύτερες τιμές να παράγουν μία πιο ομαλή καμπύλη. Ας υποθέσουμε ότι αποφασίζετε να αλλάξετε την τιμή του span από την προεπιλογή του 0,75 σε 0,9: είναι εύκολο για έναν μελλοντικό αναγνώστη να καταλάβει τι συμβαίνει, αλλά αν δεν σημειώσετε τη σκέψη σας σε ένα σχόλιο, κανείς δεν θα καταλάβει γιατί αλλάξατε την προεπιλεγμένη τιμή.

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

2.3 Τι περιέχει ένα όνομα;

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

i_use_snake_case
otherPeopleUseCamelCase
some.people.use.periods
And_aFew.People_RENOUNCEconvention

Θα επιστρέψουμε ξανά στα ονόματα όταν συζητάμε το στυλ γραφής κώδικα στο Κεφάλαιο 4.

Μπορείτε να επιθεωρήσετε ένα αντικείμενο πληκτρολογώντας το όνομα του:

x
#> [1] 12

Ας κάνουμε άλλη μία ανάθεση:

this_is_a_really_long_name <- 2.5

Για να επιθεωρήσετε αυτό το αντικείμενο, δοκιμάστε τη δυνατότητα συμπλήρωσης του RStudio: πληκτρολογήστε “this”, πατήστε TAB, προσθέστε χαρακτήρες μέχρι να έχετε ένα μοναδικό πρόθεμα και, στη συνέχεια, πατήστε return.

Ας υποθέσουμε ότι κάνατε λάθος και ότι η τιμή του this_is_a_really_long_name θα πρέπει να είναι 3.5 και όχι 2.5. Μπορείτε να χρησιμοποιήσετε μία άλλη συντόμευση πληκτρολογίου για να τη διορθώσετε. Για παράδειγμα, μπορείτε να πατήσετε ↑ για να φέρετε την τελευταία εντολή που πληκτρολογήσατε και να την επεξεργαστείτε. Ή, πληκτρολογήστε “this” και, στη συνέχεια, πατήστε Cmd/Ctrl + ↑ για να εμφανίσετε όλες τις εντολές που έχετε πληκτρολογήσει και ξεκινούν με αυτά τα γράμματα. Χρησιμοποιήστε τα πλήκτρα βέλους για πλοήγηση και, στη συνέχεια, πατήστε enter για να πληκτρολογήσετε ξανά την εντολή. Αλλάξτε το 2.5 σε 3.5 και εκτελέστε ξανά.

Και ακόμη μία ανάθεση:

r_rocks <- 2^3

Ας δοκιμάσουμε να επιθεωρήσουμε αυτό το αντικείμενο:

r_rock
#> Error: object 'r_rock' not found
R_rocks
#> Error: object 'R_rocks' not found

Το αποτέλεσμα αντικατοπτρίζει την συμφωνία που υπονοείται ανάμεσα σε εσάς και την R: η R θα κάνει τους κουραστικούς υπολογισμούς για εσάς, αλλά σε αντάλλαγμα, πρέπει να είστε απόλυτα ακριβείς στις οδηγίες σας. Εάν όχι, είναι πιθανό να λάβετε ένα σφάλμα που λέει ότι το αντικείμενο που αναζητάτε δεν βρέθηκε. Τα τυπογραφικά λάθη έχουν σημασία. Η R δεν μπορεί να διαβάσει το μυαλό σας και να πει, “α, μάλλον εννοούσαν r_rocks όταν πληκτρολογούσαν r_rock”. Και ο τρόπος γραφής έχει σημασία. Ομοίως, η R δεν μπορεί να διαβάσει το μυαλό σας και να πει, “α, μάλλον εννοούσαν r_rocks όταν πληκτρολογούσαν R_rocks”.

2.4 Καλώντας συναρτήσεις

Η R διαθέτει μία πλούσια συλλογή ενσωματωμένων συναρτήσεων, τις οποίες μπορούμε να καλέσουμε ως εξής:

function_name(argument1 = value1, argument2 = value2, ...)

Ας δοκιμάσουμε να χρησιμοποιήσουμε τη συνάρτηση seq(), η οποίο δημιουργεί κανονικές ακολουθίες (sequences) αριθμών, και όσο το κάνουμε αυτό, ας μάθουμε περισσότερες χρήσιμες λειτουργίες του RStudio. Πληκτρολογήστε se και πατήστε TAB. Ένα αναδυόμενο παράθυρο εμφανίζει πιθανές ολοκληρώσεις. Καθορίστε την seq() πληκτρολογώντας περισσότερους χαρακτήρες (ένα q ακόμη) για να είναι πιο ξεκάθαρο από τις άλλες εναλλακτικές, ή χρησιμοποιώντας τα βέλη ↑/↓ για επιλογή. Παρατηρήστε την αιωρούμενη επεξήγηση που εμφανίζεται, υπενθυμίζοντας σας τα ορίσματα και τον σκοπό της συνάρτησης. Εάν θέλετε περισσότερη βοήθεια, πατήστε F1 για να δείτε όλες τις λεπτομέρειες στην καρτέλα βοήθεια στο κάτω δεξιό τμήμα του πλαισίου

Όταν επιλέξετε τη συνάρτηση που θέλετε, πατήστε ξανά το TAB. Το RStudio θα προσθέσει αντίστοιχες παρενθέσεις ανοίγματος (() και κλεισίματος ()) για εσάς. Πληκτρολογήστε το όνομα του πρώτου ορίσματος, from (από) και ορίστε το ίσο με 1. Στη συνέχεια, πληκτρολογήστε το όνομα του δεύτερου ορίσματος, to (προς) και ορίστε το ίσο με 10. Τέλος, πατήστε το πλήκτρο return.

seq(from = 1, to = 10)
#>  [1]  1  2  3  4  5  6  7  8  9 10

Συχνά παραλείπουμε τα ονόματα των πρώτων ορισμάτων όταν καλούμε συναρτήσεις, οπότε ο παραπάνω κώδικας μπορεί να γραφεί και ως:

seq(1, 10)
#>  [1]  1  2  3  4  5  6  7  8  9 10

Πληκτρολογήστε τον ακόλουθο κώδικα και παρατηρήστε ότι το RStudio προσφέρει παρόμοια βοήθεια με τα διπλά εισαγωγικά:

x <- "hello world"

Τα εισαγωγικά και οι παρενθέσεις πρέπει πάντα να έρχονται σε ζεύγη. Το RStudio κάνει το καλύτερο που μπορεί για να σας βοηθήσει, αλλά εξακολουθεί να είναι πιθανό να μπερδευτείτε και να καταλήξετε με κάτι που δεν είναι συμβατό. Εάν συμβεί αυτό, η R θα σας δείξει τον χαρακτήρα συνέχισης “+”:

> x <- "hello
+

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

Σημειώστε ότι η καρτέλα περιβάλλοντος στο επάνω δεξιό πλαίσιο εμφανίζει όλα τα αντικείμενα που έχετε δημιουργήσει:

Καρτέλα περιβάλλοντος του RStudio, η οποία δείχνει τις μεταβλητές r_rocks, this_is_a_really_long_name, x, και y στο καθολικό περιβάλλον

2.5 Ασκήσεις

  1. Γιατί δεν δουλεύει ο ακόλουθος κώδικας;

    my_variable <- 10
    my_varıable
    #> Error in eval(expr, envir, enclos): object 'my_varıable' not found

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

  2. Πειράξτε τις παρακάτω εντολές R ώστε ο κώδικας να τρέχει σωστά:

    libary(todyverse)
    
    ggplot(dTA = mpg) + 
      geom_point(maping = aes(x = displ y = hwy)) +
      geom_smooth(method = "lm)
  3. Πατήστε Option + Shift + K / Alt + Shift + K. Τι συμβαίνει; Πώς μπορείτε να πετύχετε το ίδιο αποτέλεσμα χρησιμοποιώντας τα μενού επιλογών;

  4. Ας ξαναδούμε μία άσκηση από την Ενότητα 1.6. Εκτελέστε τις ακόλουθες γραμμές κώδικα. Ποιο από τα δύο διαγράμματα αποθηκεύεται ως mpg-plot.png; Γιατί;

    my_bar_plot <- ggplot(mpg, aes(x = class)) +
      geom_bar()
    my_scatter_plot <- ggplot(mpg, aes(x = cty, y = hwy)) +
      geom_point()
    ggsave(filename = "mpg-plot.png", plot = my_bar_plot)

2.6 Σύνοψη

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