Mam duży zestaw danych z wieloma wymiarami. Tworzę eksplorator danych, który moim zdaniem będzie bardziej przyjazny dla użytkownika, jeśli dane można wybierać na wielu kartach, a nie na naprawdę długim pasku bocznym. Grałem wokół tej koncepcji z minimalnym przykładem roboczym (poniżej), ale nie mogę przejść do zakładki wydruku, gdy kliknę przycisk Widok działki. Reaktywność zadziała, gdy tylko kliknę kartę fabuły, ale nie zareaguje, gdy zaktualizuję niektóre selekcje (takie jak liczba klastrów).Dynamiczne wybieranie wielu kart w błyszczącej aplikacji
library(shiny)
runApp(list(
ui = shinyUI(fluidPage(
headerPanel('Iris k-means clustering'),
mainPanel(
tabsetPanel(
type = "tabs",
tabPanel(title = "Select X",
selectInput('xcol', 'X Variable', names(iris)),
HTML("<div id='linkToY'><FORM><INPUT Type='BUTTON' VALUE='Next'></FORM></div>")),
tabPanel(title = "Select Y",
selectInput('ycol', 'Y Variable', names(iris), selected=names(iris)[[2]]),
HTML("<div id='linkToClusters'><FORM><INPUT Type='BUTTON' VALUE='Next'></FORM></div>")),
tabPanel("Select Clusters", numericInput('clusters', 'Cluster count', 3, min = 1, max = 9),
HTML("<div id='linkToPlot'><FORM><INPUT Type='BUTTON' VALUE='View Plot'></FORM></div>"),
HTML("<div id='linkToData'><FORM><INPUT Type='BUTTON' VALUE='View Data'></FORM></div>")),
tabPanel(title = "Plot", plotOutput('plot1')),
tabPanel(title = "Data",
dataTableOutput(outputId="table"),
HTML("<script>$('#linkToY').click(function() {
tabs = $('.tabbable .nav.nav-tabs li')
tabs.each(function() {
$(this).removeClass('active')
})
$(tabs[1]).addClass('active')
tabsContents = $('.tabbable .tab-content .tab-pane')
tabsContents.each(function() {
$(this).removeClass('active')
})
$(tabsContents[1]).addClass('active')
$('#summary').trigger('change').trigger('shown');
})</script>"),
HTML("<script>$('#linkToClusters').click(function() {
tabs = $('.tabbable .nav.nav-tabs li')
tabs.each(function() {
$(this).removeClass('active')
})
$(tabs[2]).addClass('active')
tabsContents = $('.tabbable .tab-content .tab-pane')
tabsContents.each(function() {
$(this).removeClass('active')
})
$(tabsContents[2]).addClass('active')
$('#summary').trigger('change').trigger('shown');
})</script>"),
HTML("<script>$('#linkToPlot').click(function() {
tabs = $('.tabbable .nav.nav-tabs li')
tabs.each(function() {
$(this).removeClass('active')
})
$(tabs[3]).addClass('active')
tabsContents = $('.tabbable .tab-content .tab-pane')
tabsContents.each(function() {
$(this).removeClass('active')
})
$(tabsContents[3]).addClass('active')
$('#summary').trigger('change').trigger('shown');
})</script>"),
HTML("<script>$('#linkToData').click(function() {
tabs = $('.tabbable .nav.nav-tabs li')
tabs.each(function() {
$(this).removeClass('active')
})
$(tabs[4]).addClass('active')
tabsContents = $('.tabbable .tab-content .tab-pane')
tabsContents.each(function() {
$(this).removeClass('active')
})
$(tabsContents[4]).addClass('active')
$('#summary').trigger('change').trigger('shown');
})</script>")
)
)
)
)),
server = function(input, output) {
selectedData <- reactive({
iris[, c(input$xcol, input$ycol)]
})
clusters <- reactive({
kmeans(selectedData(), input$clusters)
})
output$plot1 <- renderPlot({
plot(selectedData(),
col = clusters()$cluster,
pch = 20, cex = 3)
points(clusters()$centers, pch = 4, cex = 4, lwd = 4)
})
output$table <- renderDataTable({
selectedData()
})
}
))
UPDATE:
Udało nam się w pełni wdrożyć „Widok danych” i „powrót do wyboru” przycisków przy użyciu roztworu @jdharrison w pierwszych dwóch kartach http://www.wittgensteincentre.org/dataexplorer
Dodaj wiersz 'input $ linkToPlot' na' renderPlot() ', aby rozwiązać problem z tym. Za każdym kliknięciem przycisku nowy wykres jest renderowany. 'reactiveValues ()' może być twoim rozwiązaniem do aktualizacji wykresu za każdym razem, gdy wartość zostanie zmieniona. –
@MikaelJumppanen. Nie jestem pewien, gdzie dokładnie powinienem dodać dane wejściowe $ linkToPlot? Czy możesz edytować pytanie do pokazania? Twoje zdrowie. – gjabel
Hmm. Wygląda na to, że twoje przyciski nie są reaktywne, jak 'actionButton()' i 'actionLink()'. Używam 'actionButton' do renderowania wykresów. Jeśli zostanie naciśnięty przycisk actionButton, zmiany wartości i wykres zostanie ponownie wyrenderowany. –