Διαδρομές
/
R
R
/
Ύλη
/
Συνθήκες
Συ

Συνθήκες σε R

2 ασκήσεις

Σχετικά με την έννοια Συνθήκες

Τελεστές σύγκρισης

Η R έχει ένα σύνολο τελεστών που είναι το ίδιο με πολλές άλλες γλώσσες:

1 == 2 # FALSE
1 != 2 # TRUE
1 < 2 # TRUE
1 > 2 # FALSE
1 <= 2 # TRUE
1 >= 2 # FALSE

Διακλάδωση

Η βασική μορφή ενός if-then-else είναι:

if (x > 10) {
    y <- "big"
} else if (x > 2) {
    y <- "medium"
} else {
    y <- "tiny"
}

Σε αυτή την περίπτωση, απαιτούνται και οι παρενθέσεις ( ) γύρω από τη συνθήκη Boolean και τα άγκιστρα { } γύρω από το σώμα.

Μια απλή εντολή if μπορεί να συντομευτεί:

if (x == 0) return("success")

Χρήση διανυσμάτων σε συνθήκες

Κοιτάζοντας μπροστά προς την έννοια vector-filtering: η συνθήκη μέσα στις παρενθέσεις () πρέπει να αξιολογείται σε μία μόνο τιμή TRUE/FALSE.

Η συμπερίληψη διανυσμάτων στη σύγκριση συνήθως δίνει ένα διάνυσμα από Boolean, οπότε αυτά θα χρειαστεί να τυλιχτούν σε μια συνάρτηση συνάθροισης, όπως η all() (είναι όλες οι τιμές TRUE;) ή η any() (είναι τουλάχιστον μία τιμή TRUE;).

numbers <- c(4,5,7,9,10,11)
numbers %% 3 == 0 # gives vector of booleans
#> [1] FALSE FALSE FALSE  TRUE FALSE FALSE

# use any() to get a single TRUE/FALSE
if (any(numbers %% 3 == 0)) print("1 or more numbers are divisible by 3")
#> [1] "1 or more numbers are divisible by 3"

Η συνάρτηση ifelse

Μια εναλλακτική μορφή if-else μπορεί να φανεί χρήσιμη, αρκεί το αποτέλεσμα να είναι μόνο αληθές ή ψευδές.

y <- ifelse(x > 8, "big", "small")

# Don't mix result types:
z <- ifelse(x > 100, 100, "small") # numeric or string result? Expect problems!

Η ifelse() δέχεται ακριβώς τρεις παραμέτρους:

  1. συνθήκη Boolean
  2. τιμή αν είναι TRUE
  3. τιμή αν είναι FALSE.

Οι είσοδοι με διανύσματα είναι αποδεκτές, και τότε παράγεται έξοδος διανύσματος. Σε αυτή την περίπτωση, βεβαιώσου ότι και οι δύο κλάδοι καταλήγουν στον ίδιο τύπο δεδομένων: αριθμητικό, χαρακτήρων, λογικό, κ.λπ. Αυτό θα καλυφθεί στην έννοια vector-functions.

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

Η συνάρτηση if_else

Ιστορικό

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

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

Αυτά τα πακέτα αποτελούν τη συλλογή tidyverse. Προστέθηκαν στον εκτελεστή δοκιμών του Exercism το 2023 και είναι διαθέσιμα για να τα χρησιμοποιήσεις στις ασκήσεις.

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

Το πακέτο dplyr

Το dplyr ασχολείται κυρίως με τον χειρισμό dataframes (θα καλυφθεί αργότερα στο μάθημα).

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

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

library(dplyr) # warnings not shown

x <- 10
if_else(x > 8, "big", "small")
#> [1] "big"

Η κύρια διαφορά είναι ότι η if_else μπορεί να δεχτεί ένα προαιρετικό τέταρτο όρισμα, για τιμές που λείπουν οι οποίες στην R αναπαρίστανται με NA.

xs <- c(3, NA, 10, NA, 4)  # a 5-element vector
xs
#> [1]  3 NA 10 NA  4
if_else(xs > 8, "big", "small", "missing")
#> [1] "small"   "missing" "big"     "missing" "small" 

# contrast:
ifelse(xs > 8, "big", "small")
#> [1] "small" NA      "big"   NA      "small"

Μπορεί επίσης να διαπιστώσεις ότι η if_else δίνει πολύ καλύτερα μηνύματα σφάλματος από την παλαιότερη ifelse.

Αφού φορτώσεις τη βιβλιοθήκη dplyr, θα έχεις επίσης πρόσβαση στη συνάρτηση between().

Η R δεν επιτρέπει την αλυσίδωση συγκρίσεων, οπότε το 1 <= x <= 5 θα δώσει μήνυμα σφάλματος. Με το dplyr φορτωμένο, το between(x, 1, 5) είναι ισοδύναμο με το x >= 1 & x <= 5, και ίσως πιο ευανάγνωστο. Και το κάτω και το πάνω όριο περιλαμβάνονται.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Συνθήκες