Zacznijmy od reaktywnej części programowania. Programowanie reaktywne to programowanie z asynchronicznymi strumieniami danych. Zaczynamy od zdefiniowania tych terminów na poziomie ogólnym. Strumień to sekwencja trwających wydarzeń uporządkowanych w czasie. W rzeczywistości prawie wszystko można traktować jako strumień, ale prostymi przykładami są odbijające się piłki, gdzie zdarzenie jest brane pod uwagę za każdym razem, gdy piłka uderza w podłogę. Może się to zdarzyć wielokrotnie, wiele razy, bez określonych wzorców, zatrzymać się na chwilę, następnie kontynuować, a następnie ponownie. Użytkownicy klikający w witrynie to także strumień, w którym każde kliknięcie jest zdarzeniem. Jak możesz sobie wyobrazić, strumienie są wszędzie wokół nas. Drugi termin, który należy zdefiniować, jest asynchroniczny, co dosłownie oznacza bez synchronizacji. Zwykle funkcje synchroniczne czekają w wierszu wywołania funkcji do zakończenia wykonywania wywoływanej funkcji, prawdopodobnie zwracając wartość. W ten sposób programowaliśmy do tej pory. Jednak funkcje asynchroniczne niekoniecznie czekają na zakończenie funkcji, które wywołują. Oznacza to, że nasze funkcje muszą reagować na to, gdy tylko nadejdzie. Jeśli połączymy te dwa terminy, zrozumiemy, że programowanie z asynchronicznymi strumieniami danych działa poprzez pisanie kodu, który jest w stanie reagować na zdarzenia w sposób ciągły i losowy. W przypadku tego rozdziału zdarzeniami tymi będą interakcje użytkownika (kliknięcia lub naciśnięcia klawiszy) z naszą aplikacją, co oznacza, że nasz kod R będzie odpowiadał bezpośrednio na te kliknięcia i naciśnięcia klawiszy, gdy się one pojawią. Jeśli nadal trudno jest pojąć ten pomysł, pomyśl o tym jak o arkuszu kalkulacyjnym z formułami. Gdy zmienisz wartość, od której inne komórki zależą lub której nasłuchują (analogicznie do otrzymywania pewnych danych wejściowych od użytkownika w naszej aplikacji), wtedy inne komórki odpowiednio reagują i prezentują nowo obliczoną wartość (która będzie zmianą wyjściową, którą pokazujemy użytkownikowi ). To naprawdę takie proste. Odsłuchiwanie strumienia nazywa się subskrybowaniem. Funkcje, które definiujemy, są obserwatorami, a strumień jest obserwowalną istotą. To jest dokładnie wzorzec projektowy obserwatora. Zapoznaj się z książką Gamma, Helm, Johnson i Vlissides Design Patterns: Elements of Reusable Object-Oriented Software, autorstwa Addison-Wesley, 1994. Ponadto otrzymujesz wspaniały zestaw narzędzi, które pozwalają tworzyć, filtrować i łączyć dowolne z tych strumieni. W tym miejscu wkracza magia programowania funkcjonalnego. Programowanie funkcjonalne pozwala na kompozycję i właśnie do tego będziemy go używać, do komponowania strumieni. Strumień może służyć jako dane wejściowe do innego. Nawet wiele strumieni może być używanych jako dane wejściowe dla wielu innych. Ponadto możesz użyć dowolnego z tych surowych lub przekształconych strumieni w dowolnym miejscu kodu. To naprawdę sprawia, że Shiny jest tak wspaniałym narzędziem.
Funkcjonalne programowanie reaktywne podnosi poziom abstrakcji kodu, dzięki czemu możesz skupić się na współzależności zdarzeń, które definiują logikę aplikacji, zamiast ciągłego majstrowania przy dużej liczbie szczegółów implementacji. Kod funkcjonalny reaktywny będzie również prawdopodobnie bardziej zwięzły. Korzyści są bardziej widoczne w nowoczesnych aplikacjach, które są wysoce interaktywne. W dzisiejszych czasach aplikacje mają mnóstwo zdarzeń w czasie rzeczywistym, które umożliwiają wysoce interaktywne doświadczenia, a funkcjonalne programowanie reaktywne jest do tego doskonałym narzędziem