Keith McNulty
Keith McNultyDigital and Analytics Leader / Mathematician / Data Scientist @ McKinsey & Company

10 rzeczy, które ułatwią Ci pracę w języku R

Poznaj takie komponenty języka R, jak funkcja switch, skróty klawiszowe w RStudio oraz pakiet flexdashboard, i dowiedz się, w jaki sposób mogą Ci one ułatwić pracę.
15.04.20206 min
10 rzeczy, które ułatwią Ci pracę w języku R

Często opowiadam innym programistom o małych rzeczach w języku R, które pomagają mi pchnąć moje zadania do przodu. Są to zarówno trywialne skróty, jak i mało znane funkcje oraz przydatne sztuczki. Ekosystem R jest niezwykle bogaty i ciągle się rozwija, dlatego pomocne rzeczy mogą niekiedy umknąć. To też dlatego bardzo często słyszę „naprawdę? Nic o tym nie wiem!”. Zatem oto 10 rzeczy, które ułatwią Ci pracę w języku R.

1. Funkcja switch

Uwielbiam switch(). Jest to w zasadzie wygodna forma instrukcji if, która wybiera swoją wartość zgodnie z wartością innej zmiennej. Uważam, że jest to szczególnie przydatne przy pisaniu kodu, który musi załadować inny zestaw danych zgodnie z dokonanym wcześniej wyborem.

Na przykład, jeśli masz zmienną o nazwie animal i chcesz załadować inny zestaw danych w zależności od tego, czy nasze zwierze to pies, kot czy królik, to możesz napisać to w następujący sposób:

data <- read.csv(
  switch(animal, 
         "dog" = "dogdata.csv", 
         "cat" = "catdata.csv",
         "rabbit" = "rabbitdata.csv")
)

Przydaje się to w aplikacjach Shiny, w których ładujesz różne zestawy danych, a nawet zmienne środowiskowe, w zależności od jednej lub więcej opcji menu wejścia.

2. Skróty RStudio

To nie tyle sztuczka w R, ile w IDE RStudio. Klawisze skrótów dostępne dla typowych poleceń są tutaj bardzo przydatne i mogą zaoszczędzić sporo czasu. Moje dwa ulubione to ctrl+shift+m dla operatora potoku %>% oraz alt + - dla operatora przypisania <-. Jeśli chcesz zobaczyć pełny zestaw  skrótów, wpisz atl+shift+k w RStudio.

3. Pakiet flexdashboard

Jeśli chcesz szybko uruchomić dashboard Shiny przy minimalnym wysiłku, to pomoże Ci przy tym pakiet flexdashboard. Zapewnia on proste skróty HTML, które pozwalają na łatwe tworzenie pasków bocznych i organizowanie wszystkiego w wiersze i kolumny. flexdashboard ma również bardzo elastyczny pasek tytułu, który pozwala na łatwą organizację aplikacji na kilka stron, czy umieszenie ikon, linków do Githuba, adresu email itp. Ponieważ jest to pakiet działający w ramach RMarkdown, pozwala on również na przechowywanie całej aplikacji w jednym pliku Rmd, bez konieczności dzielenia jej na osobne pliki backendu i frontendu, takie jak shinydashboard.

Korzystam z flexdashboard za każdym razem, gdy muszę stworzyć prosty i prototypowy dashboard, zanim przejdę do bardziej zaawansowanego projektu. flexdashboard często umożliwia uruchomienie swojego projektu w mniej niż godzinę.

4. Funkcje req oraz validate w R Shiny

Tworzenie aplikacji z R Shiny może być frustrujące, zwłaszcza gdy pojawiają się nic niemówiące komunikaty o błędach. W miarę, jak Shiny się rozwija, to dodaje coraz więcej funkcji sprawdzania poprawności i testowania, aby lepiej diagnozować i ostrzegać o wystąpieniu określonych błędów. Funkcja req() pozwala zapobiec wykonywaniu akcji, chyba że w środowisku znajduje się inna zmienna, ale wtedy robi to po cichu i bez wyświetlania błędu. Możesz więc uzależnić wyświetlanie elementów UI od swoich wcześniejszych działań. Weźmy mój pierwszy przykład:

output$go_button <- shiny::renderUI({
  # only display button if an animal input has been chosen
  
  shiny::req(input$animal)
  # display button
  shiny::actionButton("go", 
                      paste("Conduct", input$animal, "analysis!") 
  )
})

validate() dokonuje check'u przed renderowaniem danych wyjściowych i umożliwia zwrócenie dostosowanego komunikatu o błędzie, jeśli określony warunek nie zostanie spełniony — na przykład, jeśli użytkownik załadował niewłaściwy plik:

# get csv input file
inFile <- input$file1
data <- inFile$datapath
# render table only if it is dogs
shiny::renderTable({
  # check that it is the dog file, not cats or rabbits
  shiny::validate(
    need("Dog Name" %in% colnames(data)),
    "Dog Name column not found - did you load the right file?"
  )
  data
})

Więcej o powyższych funkcjach tutaj.

5. Ukrywanie danych uwierzytelniających przy użyciu .Renviron

Jeśli udostępniasz kod, który wymaga danych uwierzytelniających do np. baz danych, to możesz użyć pliku .Reviron, aby uniknąć udostępnienia tych danych w miejscach, w których mogą być zagrożone (np. Github). .Renviron to plik, w którym można przechowywać ważne zmienne środowiskowe. Można go również łatwo edytować w pakiecie usethis za pomocą funkcji edit_r_environ(). Przykładem użycia może być ustawienie aliasów dla danych uwierzytelniających zdalnej bazy danych:

  DSN = "database_name",
  UID = "User ID",
  PASS = "Password"


Następnie możesz wywołać te zmienne:

db <- DBI::dbConnect(
  drv = odbc::odbc(),
  dsn = Sys.getenv("DSN"),
  uid = Sys.getenv("UID"),
  pwd = Sys.getenv("PASS")
)

6. Automatyczne stylowanie ze styler

To był ciężki dzień i było dużo do zrobienia. Twój kod nie jest tak uporządkowany, jak tego chcesz i nie masz wiele czasu na jego edycję. Na szczęście, pakiet styler posiada wiele funkcji, które pozwalają na automatyczną zmianę formatowania kodu w celu dopasowania go do stylu tidyverse. Jest to tak proste, jak uruchomienie styler::style_file() na niechlujnym skrypcie, a zrobi to dużo za Ciebie (chociaż nie wszystko):

7. Parametryzowanie dokumentów R Markdown

Piszesz właśnie dokument R Markdown, w którym znajduje się analiza faktów na temat psów. A potem ktoś Ci mówi, że jednak woli koty. To żaden problem! Możesz zautomatyzować podobny raport na temat kotów za pomocą jednego polecenia, jeśli sparametryzujesz swój dokument. Możesz to zrobić, definiując parametry w YAML-owym nagłówku dokumentu R Markdown i nadając każdemu parametrowi wartość. Na przykład:

---
title: "Animal Analysis"
author: "Keith McNulty"
date: "21 March 2019"
output:
  html_document:
    code_folding: "hide"
params:
  animal_name:
    value: Dog
    choices:
      - Dog
      - Cat
      - Rabbit
  years_of_study:
    input: slider
    min: 2000
    max: 2019
    step: 1
    round: 1
    sep: ''
    value: [2010, 2017]
---

Teraz możesz zapisać te zmienne jako params$animal_name i params$years_of_study w kodzie R. Jeśli połączysz (knit) dokument w normalny sposób, zostanie on połączony z domyślnymi wartościami tych parametrów, zdefiniowanymi przez zmienną value. Jeśli jednak wykonasz połączenie (knit) z parametrami poprzez wybór tej opcji z menu rozwijanego w Knit od RStudio (lub używając knit_with_parameters()), pojawi się opcja menu, która pozwoli Ci wybrać parametry przed połączeniem dokumentu. Niesamowite!


Łączenie z parametrami

8. revealjs

revealjs to pakiet, który pozwala na tworzenie prezentacji w HTML z intuicyjnym menu nawigacji slajdów oraz osadzonym kodem R. Może być używany wewnątrz R Markdown i ma bardzo intuicyjne skróty HTML, które pozwalają tworzyć zagnieżdżoną, logiczną strukturę slajdów z różnymi opcjami stylizacji.

Prezentacja w HTML oznacza, że można ją przeglądać na tablecie lub telefonie, gdy słucha się wykładu, a to bardzo przydatne. Możesz skonfigurować revealjspresentation, instalując pakiet, a następnie wywołać go w nagłówku YAML. Oto taki nagłówek wykładu, który niedawno wygłosiłem za pomocą revealjs:

---
title: "Exporing the Edge of the People Analytics Universe"
author: "Keith McNulty"
output:
  revealjs::revealjs_presentation:
    center: yes
    template: starwars.html
    theme: black
date: "HR Analytics Meetup London - 18 March, 2019"
resource_files:
- darth.png
- deathstar.png
- hanchewy.png
- millenium.png
- r2d2-threepio.png
- starwars.html
- starwars.png
- stormtrooper.png
---

Oto przykładowa strona. Kod można znaleźć tutaj, a prezentację tutaj.

Prosta prezentacja online stworzona przy użyciu revealjs

9. Tagi HTML w R Shiny (np. odtworzenie audio z apki w Shiny)

Większość ludzi nie korzysta w pełni z tagów HTML dostępnych w R Shiny, a istnieje ich aż 110 i oferują skróty do różnych formatów HTML i innych poleceń. Ostatnio stworzyłem aplikację Shiny, która potrzebowała dużo czasu na wykonania danego zadania. Zdając sobie sprawę z tego, że użytkownik pewnie zajmie się innymi rzeczami, czekając na ukończenie zadania, użyłem tag$audio, aby aplikacja grała fanfarę, jako powiadomienie o zakończeniu zadania.

10. Pakiet praise

praise to niezwykle prosty pakiet, który zapewnia pochwały dla użytkowników. Chociaż może się to wydawać bezcelowe, to jest to tak naprawdę bardzo przydatne przy pisaniu pakietów R, gdzie możesz zaoferować komuś pochwałę za poprawnie zakończony proces. Możesz ją również umieścić na końcu skomplikowanego skryptu, aby dać zastrzyk endorfin, kiedy poprawnie się on odpali.


Pakiet praise



Oryginał tekstu w języku angielskim przeczytasz tutaj.

<p>Loading...</p>