Teraz zobaczymy, jak dodać rozwijane dane wejściowe, których wpisy dostosowują się do zakładki, którą użytkownik aktualnie przegląda. W szczególności dodamy możliwość wybrania przez użytkownika zasobu, którego chce użyć do filtrowania danych. Jeśli przyjrzałeś się uważnie, być może zauważyłeś, że dynamiczna tabela danych zawiera obserwacje zarówno dla Bitcoin, jak i Litecoin, co może być w porządku, gdy tylko patrzymy na tabelę, ale będzie to problem, gdy spróbujemy pokazać serie czasowe cen, ponieważ będziemy mieć dane dla więcej niż jednego kapitał. Chcemy zapewnić mechanizm wyboru tylko jednego z nich, ale chcemy zachować możliwość przeglądania ich wszystkich razem w dynamicznej tabeli danych, tak jak robimy to teraz. Zaczynamy od utworzenia obiektu, który zawiera unikalne nazwy zasobów, które obecnie mamy w danych. Jest to o wiele lepsze niż zakodowanie ich nazw bezpośrednio w kodzie, ponieważ będą one automatycznie aktualizowane, gdy zmieniają się nasze dane, co nie miałoby miejsca, gdybyśmy je zakodowali. Ta linia powinna znajdować się tuż pod poprzednimi obiektami globalnymi, które należy utworzyć tylko raz:
DATA_ASSETS <- unique(ORIGNAL_DATA$name)
Ponieważ widget wejściowy w tym przypadku ma dynamiczną logikę, nie możemy po prostu tworzyć wewnątrz obiektu ui, musimy go utworzyć w funkcji server i przekazać do obiektu ui . Można to zrobić, wprowadzając nowego obserwatora do parametru output, nazwanego select_asset w tym przypadku, który jest tworzony za pomocą funkcji renderUI() , ponieważ będzie zawierał funkcję *Input() Shiny. Podobnie jak data w poprzedniej sekcji, przypiszemy domyślne nazwy zasobów i tylko w przypadku, gdy użytkownik znajduje się na drugiej karcie, która jest kartą Data Overview (więcej informacji na temat tego, skąd pochodzi poniżej), doda również opcję All do listy rozwijanej. W przeciwnym razie po prostu zachowa nazwy zasobów bez opcji All, czego chcemy dla wykresów SMA, które utworzymy później:
server <- function(input, output) {
output$table <- DT:: renderDataTable(DT:: datatable ({
data <- ORIGINAL_DATA
start <- input$date_range[1]
end <- input$date_range[2]
if (time_to_date_string.TimeStamp(start) != DATE_MIN |
time_to_date_string.TimeStamp(end) != DATE_END) {
data <- data[
data$timestamp >= time_to_timestamp.TimeStamp(start) &
data$timestamp <= time_to_timestamp.TimeStamp(end), ]
}
return(data)
}))
output$selet_asset <- renderUI ({
assets <- DATA_ASSETS
if (input$tab_selected == 2_ {
assets <- c(„ALL” , assets)
}
return(selectInput(„asset”, „Asset :” , assets))
})
Aby faktycznie zapewnić mechanizm dla server umożliwiający zrozumienie, jaką kartę aktualnie przegląda użytkownik, obiekt ui należy dostosować tak, aby funkcja tabsetPanel() otrzymywała parametr id z nazwą obiektu, który zawiera bieżący numer karty, tab_selected w tym przypadku (którym jest nazwa użyta do sprawdzenia funkcji). Ponadto każda karta w obrębie musi mieć przypisaną wartość z parametrem value, jak pokazano. W ten sposób upewniamy się, że karta Data Overview jest identyfikowana z wartością 2. Zwróć również uwagę, że dodaliśmy wywołanie funkcji htmlOutput() w ramach właśnie wprowadzonego wywołania funkcji wellPanel() w funkcji sidePanel(). wellPanel grupuje wizualnie panele, aby zapewnić użytkownikom bardziej intuicyjne interfejsy, a funkcja htmlOutput() wykorzystuje nazwę obserwatora, aby wiedzieć, co pokazać w przeglądarce internetowej, element select_asset obiektu output w tym przypadku:
ui <- fluidPage (
titlePanel („Cryptourrency Markets”),
sidebarLayout (
sidebarPanel (
wellPanel (
dateRangeInput (
„date_range”,
label = paste(„Date range :”),
start = DATE_MIN,
end =DATE_END,
min = DATE_MIN,
max = DATE_MAX,
separator = „ to „,
format = „yyyy-mm-dd”,
weeekstart = 1,
startview – „year”
),
htmlOutput(„select_asset”)
)
),
mainPanel (
tabsetPanel (
id = „tab_selected”,
tabPanel (
„Simple Moving Averages”,
value = 1,
„Content 1”
(,
tabPabel (
„Data Overview”,
value = 2,
fluidRow(DT::dataTableOutput („table”))
)
)
)
)
)
Po dokonaniu tych zmian, teraz widzimy, że nasza aplikacja wyświetla listę rozwijaną z nazwą zasobu z opcjami Bitcoin i Litecoin kiedy użytkownik znajduje się na karcie Simple Moving Averages, a także zawiera opcję All, gdy znajdują się na karcie Data Overview, tak jak chcieliśmy i jak widać na poniższym zrzucie ekranu :