Bloki konstrukcyjne reaktywności w Shiny są zbudowane wokół trzech typów funkcji: funkcji wejściowych, wyjściowych i renderujących. Funkcje wejściowe przez większość czasu kończą się łańcuchem Input (nie zawsze) i będę nazywać je funkcjami Input(). Funkcje wyjściowe zawsze kończą się łańcuchem Output i będę nazywać je funkcjami Output() . Wreszcie funkcje renderujące zaczynają się od ciągu znaków render i podobnie będę nazywać je funkcjami render*(). Funkcje Input*() są używane w obiekcie ui i generują wartości reaktywne, które są wartościami otrzymanymi w wyniku interakcji za pośrednictwem przeglądarki internetowej i są przekazywane przez parametr input w funkcji server . Funkcje render*() są używane wewnątrz funkcji server i wykorzystują wartości reaktywne do tworzenia obserwacji, które wracają do obiektu ui za pośrednictwem parametru output funkcji server. Wreszcie, funkcje *Output() są używane w obiekcie ui , aby wyświetlić zawartość tych obserwacji w przeglądarce internetowej. Wartości reaktywne są odbierane w funkcji server() za pośrednictwem parametru input , czyli listy, której elementy zawierają elementy, które są połączone z obiektem ui za pomocą ciągów znaków pełniących rolę unikalnych identyfikatorów. Parametr output w funkcji server jest również listą, ale służy do odbierania obserwacji, które zostaną przesłane do przeglądarki internetowej. Funkcje, które wiedzą, jak radzić sobie z wartościami reaktywnymi, nazywane są funkcjami reaktywnymi. Nie każda funkcja R jest funkcją reaktywną i wymagają specjalnych mechanizmów konstrukcyjnych dostarczonych przez Shiny, a jeśli spróbujesz użyć wartości reaktywnej w funkcji niereaktywnej, otrzymasz błąd (jest to łatwy błąd przy uruchomieniu Shiny). Funkcje render*() służą do tworzenia funkcji reaktywnych. Innym sposobem jest użycie funkcji reactive(), którą wyjaśnimy w dalszej części. Funkcje reaktywne są powszechnie używane do generowania obserwacji, które mogą być używane przez inne funkcje reaktywne lub przez funkcje render*(). Jednak funkcje reaktywne mogą również powodować efekty uboczne (na przykład zapis do bazy danych). Jeśli funkcje reaktywne mają wartości return, są one zapisywane w pamięci podręcznej, dzięki czemu funkcja nie musi być ponownie wykonywana, jeśli odpowiadające jej wartości reaktywne nie uległy zmianie.