Προγραμματισμός

Μετατρέψτε ένα έγγραφο R Markdown σε διαδραστική εμπειρία

Το R Markdown είναι ένα από τα αγαπημένα μου πράγματα για το σύγχρονο R. Προσφέρει έναν εύκολο τρόπο για να συνδυάσω κείμενο, κώδικα R και τα αποτελέσματα του κώδικα R σε ένα μόνο έγγραφο. Και όταν αυτό το έγγραφο αποδίδεται ως HTML, μπορείτε να προσθέσετε κάποια αλληλεπίδραση χρήστη με widget HTML όπως DT για πίνακες ή φυλλάδιο για χάρτες. (Εάν δεν είστε εξοικειωμένοι με το R Markdown, μπορείτε να δείτε πρώτα το εκπαιδευτικό βίντεο R Markdown και έπειτα να επιστρέψετε εδώ.)

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

Το Shiny είναι ένα πλαίσιο εφαρμογής Ιστού για τον R. Ως πλαίσιο, έχει μια αρκετά συγκεκριμένη δομή. Ωστόσο, μπορείτε να μετατρέψετε ένα έγγραφο R Markdown σε μια εφαρμογή Shiny χωρίς να χρειάζεται να ακολουθήσετε πολλές από αυτές τις άκαμπτες δομές. Αντ 'αυτού, μπορείτε να μεταβείτε δεξιά και να αρχίσετε να κωδικοποιείτε - χωρίς να ανησυχείτε για κάποιες τυπικές λαμπερές εργασίες, όπως η εξασφάλιση ότι όλες οι παρενθέσεις και τα κόμματα είναι σωστές σε λειτουργίες διάταξης με έντονη ένθεση.

Στην πραγματικότητα, ακόμη και αν είστε έμπειρος λαμπερός προγραμματιστής, ένα έγγραφο R Markdown μπορεί να εξακολουθεί να είναι χρήσιμο για λαμπερές εργασίες όπου δεν χρειάζεστε μια πλήρη εφαρμογή ή για γρήγορη δοκιμή κώδικα. Θα χρειαστεί ακόμα έναν διακομιστή Shiny, αλλά αν έχετε εγκαταστήσει το RStudio και το γυαλιστερό πακέτο, έχετε ήδη ένα από αυτά τοπικά.

Ας ρίξουμε μια ματιά στο πώς λειτουργεί το λαμπερό χρόνο εκτέλεσης στο R Markdown.

1. Βασική βαθμολογία R

Θα ξεκινήσω με ένα συμβατικό, μη Shiny R Markdown έγγραφο που διαθέτει έναν πίνακα δεδομένων με δυνατότητα αναζήτησης από τον ταχυδρομικό κώδικα της Μασαχουσέτης. Οι χρήστες μπορούν να αναζητήσουν ή να ταξινομήσουν οποιαδήποτε στήλη πίνακα, απαντώντας σε ερωτήσεις όπως "Ποιοι ταχυδρομικοί κώδικες έχουν το υψηλότερο μέσο εισόδημα νοικοκυριού Middlesex County;" ή "Ποιοι ταχυδρομικοί κώδικες έχουν την πιο ακριβή μηνιαία κατοικία;"

Sharon Machlis /

Αυτό το έγγραφο έχει επίσης ένα ιστόγραμμα που δείχνει την κατανομή των μέσων εισοδημάτων των νοικοκυριών και το κείμενο που δηλώνει ποιοι ταχυδρομικοί κώδικες έχουν τα υψηλότερα και χαμηλότερα εισοδήματα. Ο πίνακας είναι διαδραστικός, αλλά το υπόλοιπο έγγραφο δεν είναι. Μπορείτε να δείτε την έκδοση HTML που αποδίδεται στα RPubs του RStudio.

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

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

Μια λύση είναι να δημιουργήσετε μια σελίδα για κάθε πόλη - δυνατή με ένα σενάριο R εάν χρησιμοποιείτε αυτό που ονομάζεται παραμετροποιημένες αναφορές. Ωστόσο, μπορείτε επίσης να δημιουργήσετε ένα έγγραφο R Markdown που λειτουργεί σαν μια διαδραστική εφαρμογή.

Προσθέστε λαμπερή διαδραστικότητα

Για να προσθέσετε λαμπερή διαδραστικότητα σε ένα συμβατικό έγγραφο R Markdown, ξεκινήστε προσθέτοντας χρόνος εκτέλεσης: γυαλιστερό στην κεφαλίδα YAML του εγγράφου, όπως:

---

τίτλος: "Μέσο εισόδημα νοικοκυριού με ταχυδρομικό κώδικα"

έξοδος: html_document

χρόνος εκτέλεσης: γυαλιστερό

---

Μόλις το κάνετε αυτό και πατήσετε Αποθήκευση, το πλεκτό εικονίδιο στο RStudio μετατρέπεται σε "Εκτέλεση εγγράφου". Παρόλο που η έξοδος εξακολουθεί να λέει "html_document", δεν θα είναι πλέον απλή HTML. Είναι τώρα μια εφαρμογή mini-Shiny.

Sharon Machlis / Sharon Machlis,

Αφήστε τους χρήστες να κάνουν επιλογές δεδομένων

Τώρα χρειάζομαι έναν τρόπο για τους χρήστες να κάνουν τις επιλογές δεδομένων τους. Η Shiny διαθέτει έναν αριθμό "widget εισαγωγής" για αυτό. Θα χρησιμοποιήσω selectInput (), η οποία δημιουργεί μια αναπτυσσόμενη λίστα και επιτρέπει στους χρήστες να επιλέγουν περισσότερα από ένα στοιχεία. Το Shiny διαθέτει άλλα widget για κουμπιά επιλογής, εισόδους κειμένου, επιλογείς ημερομηνιών και άλλα. Μπορείτε να δείτε μια συλλογή από αυτά στη συλλογή Shiny Widgets του RStudio.

Κωδικός για τις μίνι εφαρμογές μου selectInput () Η αναπτυσσόμενη λίστα έχει πέντε ορίσματα και μοιάζει με αυτό:

selectInput ("mycities", "Επιλέξτε 1 ή περισσότερες πόλεις:",

επιλογές = ταξινόμηση (μοναδικό (markdowndata $ City)),

επιλεγμένο = "Βοστώνη", πολλαπλάσιο = ΑΛΗΘΟΣ)

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

Αυτός ο κώδικας δημιουργεί την αναπτυσσόμενη λίστα HTML. Εάν το εκτελέσετε selectInput () κώδικα στην κονσόλα R, θα δημιουργήσει HTML για το αναπτυσσόμενο μενού (υποθέτοντας ότι έχετε φορτώσει το Shiny και ένα πλαίσιο δεδομένων που ονομάζεται markdowndata με μια στήλη Πόλη).

Στη συνέχεια, πρέπει να γράψω λίγο R έτσι ώστε αυτό το αναπτυσσόμενο μενού να κάνει κάτι.

Δημιουργήστε δυναμικές μεταβλητές

Θα κωδικοποιήσω αυτήν τη λογική διαδραστικότητας σε δύο μέρη:

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

Το πιο σημαντικό πράγμα που πρέπει να θυμάστε σε αυτό το σημείο είναι ότι αυτά τα αντικείμενα δεν είναι πλέον «κανονικές» μεταβλητές R. Είναι δυναμικός. Αυτοί αλλαγή με βάση τις ενέργειες των χρηστών. Και αυτό σημαίνει ότι λειτουργούν ελαφρώς διαφορετικά από τις μεταβλητές που πιθανώς έχετε συνηθίσει.

Τι είναι ξεχωριστό γι 'αυτούς; Εδώ είναι τα τρία πράγματα που πρέπει να γνωρίζετε:

  1. Για να αποκτήσετε πρόσβαση στην τιμή μιας μεταβλητής εισόδου που αποθηκεύει πληροφορίες από τον χρήστη σας, χρειάζεστε τη σύνταξη εισάγετε $ myvarname, όχι απλά myvarname. Έτσι, για τιμές που είναι αποθηκευμένες στο μύκες αναπτυσσόμενη λίστα, χρήση εισάγετε $ mycities
  2. Αντικείμενα όπως γραφήματα και πίνακες που εξαρτώνται από τιμές από τον χρήστη σας είναι επίσης δυναμικά και πρέπει να είναι αντιδραστικά. Αυτό είναι τόσο εύκολο όσο το τυλίγετε σε μια ειδική λειτουργία, αλλά πρέπει να θυμάστε να το κάνετε. Δεν είναι δυνατή η πρόσβαση σε αυτά μόνο με τα ονόματά τους, αλλά απαιτούν παρενθέσεις επίσης: σαν σύνταξη myvar () και οχι myvar.
  3. Οταν εσύαπεικόνιση δυναμικό περιεχόμενο - για άλλη μια φορά, πράγματα όπως ένας πίνακας, ένας χάρτης, ένα ιστόγραμμα ή ακόμη και ένα κείμενο - πρέπει να αποδίδεται με έναν ειδικό τρόπο, συνήθως χρησιμοποιώντας μία από τις ειδικές λειτουργίες απόδοσης του Shiny. Τα καλά νέα είναι ότι η Shiny φροντίζει το μεγαλύτερο μέρος της λειτουργικότητας της παρακολούθησης αλλαγών και του υπολογισμού των αποτελεσμάτων. Απλά πρέπει να γνωρίζετε ποια λειτουργία να χρησιμοποιήσετε και, στη συνέχεια, να τη συμπεριλάβετε στον κωδικό σας.

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

mydata <- αντιδραστικό ({

φίλτρο (markdowndata, City% in% input $ mycities)

})

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

Εμφάνιση δυναμικών μεταβλητών

Τώρα θα ήθελα να κωδικοποιήσω έναν πίνακα χρησιμοποιώντας που φιλτράρεται τα δεδομένα μου δεδομένα.

Όπως θα μπορούσατε να μαντέψετε μέχρι τώρα, DT :: datatable (mydata) δεν θα λειτουργήσει. Και υπάρχουν δύο λόγοι για τους οποίους.

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

Αλλά, δεύτερο,DT :: datatable (mydata ()) ούτε θα λειτουργεί ως αυτόνομος κώδικας. Θα λάβετε ένα μήνυμα σφάλματος ως εξής:

 Η λειτουργία δεν επιτρέπεται χωρίς ενεργό αντιδραστικό περιβάλλον.

(Προσπαθήσατε να κάνετε κάτι που μπορεί να γίνει μόνο από μέσα

μια αντιδραστική έκφραση ή παρατηρητής.)

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

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

Αυτός είναι ο κωδικός μου πίνακα:

απόδοσηDT ({

DT :: datatable (mydata (), filter = 'top')%>%

formatCurrency (4: 5, ψηφία = 0)%>%

formatCurrency (6, νόμισμα = "", ψηφία = 0)

})

Σημείωση: Εκτός από τη δημιουργία και την εμφάνιση του πίνακα, αυτός ο κώδικας προσθέτει επίσης κάποια μορφοποίηση. Οι στήλες 4 και 5 εμφανίζονται ως νόμισμα, με ένα σύμβολο δολαρίου και κόμματα. Το δεύτερο μορφήCurrency () Η γραμμή για τη στήλη 6 προσθέτει τα κόμματα στους στρογγυλεμένους αριθμούς χωρίς το σύμβολο του δολαρίου, αφού έχω ορίσει το σύμβολο "" νομίσματος.

Μπορώ να χρησιμοποιήσω το ίδιο τα δεδομένα μου() αντιδραστικό πλαίσιο δεδομένων για τη δημιουργία ιστογράμματος, χρησιμοποιώντας μια άλλη συνάρτηση Shiny render: renderPlot ().

renderPlot ({

ggplot2 :: ggplot (mydata (), aes (x = MedianHouseholdIncome)) +

geom_histogram (binwidth = 20000, color = "black", fill = "darkgreen") +

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (ετικέτες = δολάριο)

})

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

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

"{r histo, fig.width = 3, fig.height = 2}

renderPlot ({

ggplot2 :: ggplot (mydata (), aes (x = MedianHouseholdIncome)) +

geom_histogram (binwidth = 20000, color = "black", fill = "darkgreen") +

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (ετικέτες = δολάριο)

})

```

Αν θα ήθελα να εμφανίσω διαδραστικό κείμενο που αλλάζει με την επιλογή του χρήστη, χρειάζομαι μια λειτουργία Shiny render που ονομάζεται - έκπληξη! -renderText (). Μπορείτε να το τοποθετήσετε σε ένα κομμάτι κώδικα ή να χρησιμοποιήσετε εναλλακτική μορφή σύνταξης R Markdown εκτός από κομμάτια κώδικα όπως αυτό:

Έχω κάποιο απλό κείμενο και έπειτα προσθέτω «Ο ΚΩΔΙΚΟΣ ΕΙΝΑΙ ΑΞΙΟΛΟΓΗΣΗ ΕΔΩ»

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

Ιστόγραμμα για "r renderText ({input $ mycities})"

Αυτό λειτουργεί καλά για μία πόλη. Ωστόσο, εάν υπάρχουν περισσότερες από μία πόλεις, αυτός ο κωδικός θα εμφανίζει τα ονόματα χωρίς κόμματα μεταξύ τους, όπως Boston Cambridge Amherst. Για δημόσιο κώδικα, θα θέλατε να το αυξήσετε λίγο, ίσως χρησιμοποιώντας τη βάση R Επικόλληση() λειτουργία:

Ιστόγραμμα για `r renderText ({επικόλληση (εισαγωγή $ mycities,

sep = "", collapse = ",")}) "

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

Ανακάλυψα επίσης ότι το χαμηλότερο μέσο εισόδημα ήταν ύποπτα χαμηλό - 2.500 $ στην κοινότητα κολέγιο-πόλης του Amherst, Mass. — όπου το μέσο μηνιαίο κόστος στέγασης είναι 1.215 $. Υποθέτω ότι είναι συγκέντρωση φοιτητικής στέγασης, γι 'αυτό αποκλείω οποιονδήποτε ταχυδρομικό κώδικα με μέσο εισόδημα νοικοκυριού κάτω των 5.000 $.

Εδώ είναι ο κώδικας για τη δημιουργία αυτών των δύο πλαισίων δεδομένων:

zip_highest_income_row <- αντιδραστικό ({

φίλτρο (mydata (), MedianHouseholdIncome == max (MedianHouseholdIncome, na.rm = TRUE))

})

zip_lowest_income_row <- αντιδραστικό ({

φίλτρο (mydata (), MedianHouseholdIncome> = 5000)%>%

φίλτρο (MedianHouseholdIncome == min (MedianHouseholdIncome, na.rm = TRUE))

})

Αυτό θα πρέπει να μοιάζει τυπικό φίλτρο dplyr () κωδικός, εκτός από το ότι 1) το καθένα είναι τυλιγμένο σε α αντιδραστικός ({}) συνάρτηση, και 2) το τα δεδομένα μου δυναμικό πλαίσιο δεδομένων που αλλάζει με βάση την είσοδο του χρήστη αναφέρεται ως τα δεδομένα μου() και όχι απλά τα δεδομένα μου

Για να εμφανίσετε την τιμή του πρώτου στοιχείου στο zip_highest_income_row στη στήλη ZIP του πλαισίου δεδομένων, δεν μπορώ να χρησιμοποιήσω τον συνηθισμένο κώδικα Rzip_highest_income_row $ Zip [1]. Αντ 'αυτού, πρέπει να αναφερθώ στο δυναμικό πλαίσιο δεδομένων με παρενθέσεις:zip_highest_income_row () $ Zip [1] . Και μετά τυλίξτε το σε ένα γυαλιστερό καθιστώ() συνάρτηση — σε αυτήν την περίπτωση renderText ():

Ταχυδρομικός κώδικας "r renderText (zip_highest_income_row () $ ZipCode [1])" in

"r renderText (zip_highest_income_row () $ City [1])"

έχει το υψηλότερο μέσο εισόδημα στις θέσεις που επιλέξατε,

"r renderText (κλίμακες :: δολάριο (zip_highest_income_row () $ MedianHouseholdIncome [1]))".

Ταχυδρομικός κώδικας `r renderText (zip_lowest_income_row () $ ZipCode [1])` in

"r renderText (zip_lowest_income_row () $ City [1])" έχει το χαμηλότερο

μεσαίο εισόδημα στις θέσεις που επιλέξατε,

"r renderText (κλίμακες :: δολάριο (zip_lowest_income_row () $ MedianHouseholdIncome [1]))".

Εκτελέστε και μοιραστείτε την εφαρμογή Shiny

Μόλις προσθέσετε χρόνος εκτέλεσης: γυαλιστερό σε ένα R Markdown, δεν είναι πλέον αρχείο HTML - είναι μια εφαρμογή mini Shiny. Και αυτό σημαίνει ότι χρειάζεται ένας διακομιστής Shiny για να τρέξει.

Όπως ανέφερα νωρίτερα, οποιοσδήποτε με R, RStudio και το γυαλιστερό πακέτο έχει έναν διακομιστή Shiny στο τοπικό του σύστημα. Αυτό διευκολύνει την κοινή χρήση οποιασδήποτε εφαρμογής Shiny με άλλους χρήστες R. Μπορείτε να τους στείλετε ένα έγγραφο μέσω email ή, πιο κομψά, να το δημοσιεύσετε στο διαδίκτυο ως αρχείο με φερμουάρ και να το χρησιμοποιήσετε λαμπερό :: runUrl () εντολή. Υπάρχουν ειδικές runGitHub () και runGist () λειτουργίες για εφαρμογές στο GitHub που είναι βολικές εάν χρησιμοποιείτε το GitHub για έργα, τα οποία θα συμπιέζουν αυτόματα πρόσθετα αρχεία στο έργο σας, όπως αρχεία δεδομένων.

Ωστόσο, οι πιθανότητες είναι, σε κάποιο σημείο να θέλετε να δείξετε τη δουλειά σας σε χρήστες που δεν ανήκουν σε R, και αυτό απαιτεί έναν λαμπερό διακομιστή με δυνατότητα πρόσβασης στο κοινό. Ίσως η ευκολότερη επιλογή είναι η υπηρεσία shinyapps.io του RStudio. Είναι δωρεάν για μερικές περιορισμένες δημόσιες εφαρμογές με πολύ ελαφριά χρήση. Οι λογαριασμοί επί πληρωμή βασίζονται στον αριθμό των ενεργών ωρών που προσφέρουν για τις εφαρμογές σας. Οι ενεργές ώρες μετρούν το χρόνο που χρησιμοποιείται ενεργά η εφαρμογή - ένα άτομο για μια ώρα είναι την ίδια ώρα με 100 άτομα εκείνη την ώρα. Για να εξασφαλίσετε 24ωρη διάρκεια λειτουργίας για μερικές εφαρμογές, θα χρειαστείτε τον τυπικό λογαριασμό 1.100 $ / έτος με 2.000 ώρες.

Μπορείτε επίσης να δημιουργήσετε τον δικό σας διακομιστή Shiny σε μια υπηρεσία cloud όπως AWS και εγκαταστάσεις για R και τη δωρεάν έκδοση του λογισμικού διακομιστή Shiny του RStudio. Υπάρχει ένα υπέροχο βήμα-προς-βήμα φροντιστήριο από τον Dean Attali που δείχνει πώς να το κάνετε στο Digital Ocean, όπου μπορείτε να δημιουργήσετε και να εκτελέσετε έναν μικρό διακομιστή Shiny με κόστος φιλοξενίας μόλις 5 $ το μήνα χωρίς να ανησυχείτε για τις ενεργές ώρες. Η ανταλλαγή πραγματοποιεί τις δικές σας ενημερώσεις κώδικα ενημέρωσης κώδικα και R / βιβλιοθήκης - και μπορεί να χρειαστείτε έναν πιο ισχυρό εικονικό διακομιστή από το φθηνότερο σταγονίδιο 1G για ισχυρές εφαρμογές.

Προσθέστε έναν διαδραστικό χάρτη

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

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

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

mapdata <- αντιδραστικό ({

if ("All Mass"% in% input $ mycities) {

ma_appdata_for_map%>%

dplyr :: select (ZipCode = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, Population = pop, City, County = county.name, State, Lat, Long, income, housing, Pop, γεωμετρία)%>%

αλλάσσω(

Επισημασμένο = "Ναι"

) %>%

sf :: st_as_sf ()

} αλλιώς {

dplyr :: filter (ma_appdata_for_map, City% in% input $ mycities)%>%

dplyr :: select (ZipCode = GEOID, MedianHouseholdIncome = medincome, MedianMonthlyHousingCost = medmonthlyhousingcost, Population = pop, City, County = county.name, State, Lat, Long, income, housing, Pop, γεωμετρία)%>%

dplyr :: μετάλλαξη (

Highlighted = ifelse (Πόλη% in% input $ mycities, "Ναι", "Όχι")

) %>%

sf :: st_as_sf ()

}

})

Η αντιδραστική συνάρτηση πρέπει να είναι γνωστή από τώρα. Μου αν και αλλού Οι δηλώσεις λαμβάνουν υπόψη εάν ο χρήστης έχει επιλέξει All Mass ή μόνο μεμονωμένες πόλεις. Για οποιαδήποτε επιλογή εκτός από το All Mass, φιλτράρω μόνο για τις επιλεγμένες πόλεις. Και στις δύο περιπτώσεις χρησιμοποιώ ένα συμβατικό dplyr επιλέξτε () λειτουργία για να επιλέξετε ποιες στήλες θέλω στο χάρτη, φροντίζοντας να συμπεριλάβετε Lat για γεωγραφικό πλάτος, Long για γεωγραφικό μήκος και γεωμετρία που περιέχει τα αρχεία σχήματος πολυγώνου ταχυδρομικού κώδικα. Η τελευταία γραμμή σε καθένα αν() Το τμήμα κώδικα διασφαλίζει ότι τα αποτελέσματα είναι ένα γεωγραφικό αντικείμενο sf (απλά χαρακτηριστικά). Ενώ δεν χρειαζόμουν αυτόν τον κώδικα στον τοπικό μου Mac, η εφαρμογή λειτούργησε καλύτερα στο shinyapps.io όταν το συμπεριέλαβα.

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

incomepal <- αντιδραστικό ({

φυλλάδιο :: colorNumeric (παλέτα = "Πράσινοι",

domain = mapdata () $ MedianHouseholdIncome)

})

housingpal <- αντιδραστικό ({

φυλλάδιο :: colorNumeric (παλέτα = "Πράσινοι",

domain = mapdata () $ MedianMonthlyHousingCost)

})

Θέλω και αυτά να είναι αντιδραστικά, έτσι ώστε να αλλάζουν με βάση τις επιλογές των χρηστών. Το όρισμα τομέα καθορίζει τις τιμές που θα εμφανίζει η παλέτα. Στην πρώτη περίπτωση, είναι η ενεργή στήλη MedianHouseholdIncome του αντικειμένου mapdata μου - με mapdata κωδικοποιημένο ως mapdata () αφού είναι αντιδραστικό. στη δεύτερη περίπτωση, είναι η στήλη MedianMonthlyHousingCost.

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

είναι μια αλλαγή γραμμής HTML) και στήλες πλαισίου δεδομένων. Ενώ μπορείτε σίγουρα να χρησιμοποιήσετε το βασικό R's Επικόλληση() ή επικόλληση0 () λειτουργίες, βρίσκω το πακέτο κόλλας πολύ πιο εύκολο όταν ασχολούμαι με περισσότερες από μία μεταβλητές αναμεμειγμένες με κείμενο. Μπορείτε να δείτε παρακάτω ότι πρέπει απλώς να συμπεριλάβω μεταβλητές που θέλω να αξιολογηθούν μέσα σε σγουρά τιράντες. Φυσικά, το αναδυόμενο κείμενο πρέπει να είναι και αντιδραστικό, έτσι, αλλάζει επίσης με την επιλογή του χρήστη.

mypopups <- αντιδραστικό ({

glue :: glue ("Ταχυδρομικός κώδικας: {mapdata () $ ZipCode}

Μέσο εισόδημα νοικοκυριού: {mapdata () $ εισόδημα}

Μέσο μηνιαίο κόστος στέγασης: {mapdata () $ housing}

Πληθυσμός: {mapdata () $ Pop}

Πόλη: {mapdata () $ City}

Νομός: {mapdata () $ County} ")

})

Τέλος, κωδικοποιήστε για τον ίδιο τον φυλλάδιο.

φυλλάδιο :: renderLeaflet ({

φυλλάδιο (mapdata ())%>%

addProviderTiles ("CartoDB.Positron")%>%

addPolygons (fillColor = ~ incomepal () (mapdata () $ MedianHouseholdIncome),

fillOpacity = 0,7,

βάρος = 1,0,

χρώμα = "μαύρο",

smoothFactor = 0,2,

popup = mypopups (),

group = "Εισόδημα νοικοκυριού"

) %>%

addPolygons (fillColor = ~ housingpal () (mapdata () $ MedianMonthlyHousingCost),

fillOpacity = 0,7,

βάρος = 0,2,

χρώμα = "μαύρο",

smoothFactor = 0,2,

popup = mypopups (),

group = "Κόστος στέγασης"

) %>%

addLayersControl (

baseGroups = c ("Εισόδημα νοικοκυριού", "Έξοδα στέγασης"),

θέση = "κάτω αριστερά",

επιλογές = επίπεδαControlOptions (συμπτυγμένο = FALSE)

)

})

renderLeaflet () είναι η συνάρτηση Shiny render που θα εμφανίζει το δυναμικό dataviz που βασίζεται στο δυναμικό αντικείμενο mapdata. Μέσα σε αυτήν τη λειτουργία υπάρχει "κανονικός" κωδικός χαρτογράφησης φυλλαδίων. Η πρώτη γραμμή, φυλλάδιο (mapdata ()), δημιουργεί ένα αντικείμενο φυλλαδίου R από το αντιδραστικό αντικείμενο mapdata. Χρησιμοποιεί το πακέτο φυλλαδίων, το οποίο είναι ένα περιτύλιγμα R στη βιβλιοθήκη leaflet.js. Η επόμενη γραμμή προσθέτει ένα στυλ πλακιδίων χάρτη φόντου από το CartoDB.

ο addPolygons () Η συνάρτηση λέει στο φυλλάδιο πώς να εμφανίζει τα πολύγωνα ταχυδρομικού κώδικα. Θέλω να χρωματιστεί από τη στήλη MideanHouseholdIncome χρησιμοποιώντας την παλέτα εισοδήματος που έχω δημιουργήσει νωρίτερα, incomepal. Τα περισσότερα από αυτά τα επιχειρήματα είναι στυλ. ο αναδυόμενο παράθυρο Το όρισμα ορίζει το αναδυόμενο κείμενο να είναι το mypopups αντικείμενο που δημιούργησα νωρίτερα και το όρισμα ομάδας δίνει ένα όνομα στο επίπεδο χάρτη.

Προσθέτω ένα άλλο παρόμοιο επίπεδο για το μέσο μηνιαίο κόστος στέγασης. Και, τέλος, το addLayersControl () βάζει ένα μύθο με δυνατότητα κλικ για κάθε επίπεδο κάτω αριστερά.

Sharon Machlis /

Εάν θέλετε να μάθετε περισσότερα σχετικά με τη χαρτογράφηση στο R με φυλλάδιο, ανατρέξτε στο σεμινάριό μου «Δημιουργία χαρτών στο R σε 10 (αρκετά) εύκολα βήματα».

Το τελικό αρχείο R markdown

Μπορείτε να δείτε το τελικό αρχείο R Markdown στο GitHub. Εάν κοιτάξετε προσεκτικά τον κώδικα, ενδέχεται να παρατηρήσετε μερικές προσθήκες. Πρόσθεσα το All Mass στο selectInput () αναπτυσσόμενη λίστα επιλογών λίστας, έτσι ώστε ο κώδικας να είναι τώρα

selectInput ("mycities", "Επιλέξτε 1 ή περισσότερες πόλεις:",

επιλογές = c ("All Mass", ταξινόμηση (μοναδικό (markdowndata $ City))),

πολλαπλάσιο = TRUE, επιλεγμένο = "Βοστώνη")

Και έπειτα τροποποίησα πολλές άλλες γραμμές κώδικα για να δώσω μια διαφορετική επιλογή εάν έχει επιλεγεί All Mass, όπως η δημιουργία μιας δυναμικής μεταβλητής select_places που θα λέει "Massachusetts" εάν το "All Mass" είναι μία από τις επιλεγμένες πόλεις.

select_places <- αντιδραστικό ({

if ("All Mass"% in% input $ mycities) {

"Μασαχουσέτη"

} αλλιώς {

επικόλληση (εισαγάγετε $ mycities,

sep = "", collapse = ",")

}

})

Σημειώστε επίσης τη νέα κεφαλίδα YAML:

---

τίτλος: "Μέσο εισόδημα νοικοκυριού με ταχυδρομικό κώδικα"

έξοδος: html_document

πόροι_αρχεία:

- mamarkdowndata.rdata

- zip_mass_appdata_for_map.rds

χρόνος εκτέλεσης: γυαλιστερό

---

Οτιresources_files: επιλογή λέει ότι αυτό το έγγραφο απαιτεί δύο άλλα αρχεία για να εκτελεστούν, mamarkdowndata.rdata και zip_mass_appdata_for_map.rds. Αυτό επιτρέπει στο shinyapps.io να γνωρίζει ότι τα αρχεία πρέπει να μεταφορτωθούν μαζί με το κύριο έγγραφο R Markdown κατά την ανάπτυξη ενός αρχείου μεrsconnect :: deployDoc ("docname.Rmd").

Μπορείτε να δείτε αυτό το διαδραστικό έγγραφο R Markdown με το Shiny σε δράση στη διεύθυνση //idgrapps.shinyapps.io/runtimeshiny/. Μπορεί να χρειαστεί λίγη ώρα για φόρτωση, καθώς δεν προσπάθησα να βελτιστοποιήσω αυτόν τον κωδικό για ταχύτητα. Το RStudio διαθέτει ορισμένους πόρους εάν θέλετε να μάθετε σχετικά με την επιτάχυνση των εφαρμογών Shiny.

Πώς διαφέρει αυτό από μια «πραγματική» εφαρμογή Shiny;

Αυτό το υπερ-φορτισμένο με Shiny R Markdown έγγραφο διαφέρει από μια πλήρη εφαρμογή Shiny με μερικούς βασικούς τρόπους.

1. Μια εφαρμογή Shiny πρέπει να βρίσκεται σε ένα αρχείο που ονομάζεται app.R ή δύο αρχεία ui.R και server.R. Η εφαρμογή μπορεί πηγή πρόσθετα αρχεία με άλλα ονόματα, αλλά αυτή η δομή ονομάτων αρχείων είναι απόλυτη. Σε μια εφαρμογή ενός αρχείου.R, απαιτούνται ενότητες για το ui (διεπαφή χρήστη, το οποίο καθορίζει τι βλέπει και αλληλεπιδρά ο χρήστης) και τον διακομιστή.

2. Οι λαμπερές διατάξεις εφαρμογών δημιουργούνται γύρω από το πλαίσιο πλέγματος σελίδας Bootstrap. Μπορείτε να δείτε περισσότερα σχετικά με τη δομή της διάταξης στον Οδηγό διάταξης εφαρμογών του ShStudio.

3. Πρέπει να είναι τα περισσότερα δυναμικά στοιχεία που θέλετε να αποδώσετε, συμπεριλαμβανομένων πραγμάτων όπως γραφήματα και πίνακες τοποθετείται συγκεκριμένα κάπου στη σελίδα με πρόσθετες λειτουργίες και ορισμούς εξόδου. Για παράδειγμα, ένας διαδραστικός χάρτης φυλλαδίων θα χρειαζόταν κώδικα όπως leafletOutput ("mymap") κάπου στο ui για να πείτε στην εφαρμογή πού πρέπει να εμφανίζεται, εκτός από τον κωδικό διακομιστή όπως

έξοδος $ mymap <- renderLeaflet ({#MAP CODE ΕΔΩ})

για να ορίσετε τη λογική πίσω από τη δημιουργία του χάρτη.

Ακολουθεί ένα παράδειγμα αρχείου Shiny app.R για το ιστόγραμμα και τον πίνακα αυτής της εφαρμογής:

βιβλιοθήκη ("γυαλιστερή")

βιβλιοθήκη ("dplyr")

βιβλιοθήκη ("ggplot2")

βιβλιοθήκη ("DT")

επιλογές (scipen = 999)

load ("mamarkdowndata.rdata") # φορτώνει μεταβλητή markdowndata

ma_appdata_for_map <- readRDS ("zip_mass_appdata_for_map.rds")

# Ορισμός διεπαφής χρήστη

ui <- fluidPage (

# Τίτλος αίτησης

titlePanel ("Έσοδα και έξοδα στέγασης με ταχυδρομικό κώδικα"),

# Πλευρική γραμμή

sidebarLayout (

πλαϊνή μπάρα

selectInput ("mycities", "Επιλέξτε 1 ή περισσότερα μέρη της Μασαχουσέτης:", επιλογές = c ("All Mass", ταξινόμηση (μοναδικό (markdowndata $ City))), πολλαπλάσιο = TRUE, επιλεγμένο = "Βοστώνη"),

br (),

ισχυρή ("Σημείωση: ορισμένες πόλεις μπορεί να έχουν περισσότερα από ένα ονόματα θέσεων για ταχυδρομικούς κώδικες. Για παράδειγμα, οι Άλστον, Μπράιτον, Ντόρτσεστερ και πολλές άλλες γειτονιές δεν περιλαμβάνονται στο ταχυδρομικό όνομα" Βοστώνη \ ".")

),

# Εμφάνιση ιστογράμματος

mainPanel (

h4 (htmlOutput ("histogramHeadline")),

plotOutput ("μυστερόγραμμα"),

br (),

h4 (htmlOutput ("tableHeadline")),

DTOutput ("mytable")

)

)

)

# Ορίστε τη λογική του διακομιστή που απαιτείται για την κατάρτιση ενός ιστογράμματος

διακομιστής <- λειτουργία (είσοδος, έξοδος) {

mydata <- αντιδραστικό ({

if ("All Mass"% in% input $ mycities) {

markdowndata

} αλλιώς {

φίλτρο (markdowndata, City% in% input $ mycities)

}

})

select_places <- αντιδραστικό ({

if ("All Mass"% in% input $ mycities) {

"Μασαχουσέτη"

} αλλιώς {

επικόλληση (εισαγάγετε $ mycities,

sep = "", collapse = ",")

}

})

έξοδος $ histogramHeadline <- renderUI ({

επικόλληση ("Ιστόγραμμα για", επιλεγμένες θέσεις (), "δεδομένα εισοδήματος")

})

έξοδος $ tableHeadline <- renderUI ({

επικόλληση ("Δεδομένα για", επιλεγμένα μέρη ())

})

έξοδος $ myhistogram <- renderPlot ({

ggplot (mydata (), aes (x = MedianHouseholdIncome)) +

geom_histogram (binwidth = 20000, color = "black", fill = "darkgreen") +

theme_classic () +

xlab ("") +

ylab ("") +

scale_x_continuous (ετικέτες = δολάριο)

})

έξοδος $ mytable <- renderDT ({

DT :: datatable (mydata (), filter = 'top')%>%

formatCurrency (4: 5, ψηφία = 0)%>%

formatCurrency (6, νόμισμα = "", ψηφία = 0)

})

}

# Εκτελέστε την εφαρμογή

shinyApp (ui = ui, διακομιστής = διακομιστής)

Μπορείτε να μάθετε περισσότερα σχετικά με τη δημιουργία αυτού του είδους εφαρμογών Shiny στα εκπαιδευτικά μαθήματα του RStudio.

Για περισσότερες συμβουλές R, μεταβείτε στη σελίδα βίντεο "Do More With R" ή στη λίστα αναπαραγωγής Do More With R στο YouTube.

$config[zx-auto] not found$config[zx-overlay] not found