2017-12-15 4 views
1

Ich muss eine Shiny App erstellen, die ein helles und dunkles Thema hat, das die Benutzer in der Benutzeroberfläche auswählen können. Auf der Website von RStudio wird eine Seite mit den Details themes und themeSelector() angezeigt, aber es heißt: "Der Design-Selektor ist nur für die Entwicklung einer Anwendung gedacht." Gibt es Librarys, die dynamisch veränderbare Designs erlauben, die produktionsbereit sind?Prodution ready themeSelector für Shiny

+1

Können Sie nicht den themeSelector auf einer entfalteten App lassen? Ich denke, es hilft, ein Thema zu wählen, aber Sie können es in Ihrer App lassen, selbst wenn der Entwickler fertig ist. – qfazille

+0

Ich möchte nicht wirklich, dass die Benutzer irgendein Thema wählen. Ich möchte nur, dass die Benutzer eine Option haben, ein dunkles oder ein helles Thema auszuwählen. Ich plane, GyD selectInput Steuerelement in ein actionButton zu ändern, das zwischen zwei Themen wahrscheinlich Cosmo und dunkel wählen wird. – Frek

Antwort

1

Es kann nur während der Entwicklung verwendet werden, aber ich sehe keinen Grund, warum Sie es nicht in der Produktion verwenden könnten. Wenn Sie einen Blick auf die code werfen, ist es nur das Nachschlagen und Ändern der stylesheet link in der head Abschnitt.

Es gibt keinen anderen Weg dies zu erreichen als mit javaScript, also würde ich einfach weitermachen und verwenden, was bereits geschrieben ist.

könnten Sie ändern die themeSelector Funktion von einer ziehbar Festplatte auf eine einfachen selectInput wie folgt zu ändern:

library(shiny) 
library(shinythemes) 

themeSelector <- function() { 
    div(
     div(
     selectInput("shinytheme-selector", "Choose a theme", 
        c("default", shinythemes:::allThemes()), 
        selectize = FALSE 
     ) 
    ), 
     tags$script(
     "$('#shinytheme-selector') 
     .on('change', function(el) { 
     var allThemes = $(this).find('option').map(function() { 
     if ($(this).val() === 'default') 
     return 'bootstrap'; 
     else 
     return $(this).val(); 
     }); 
     // Find the current theme 
     var curTheme = el.target.value; 
     if (curTheme === 'default') { 
     curTheme = 'bootstrap'; 
     curThemePath = 'shared/bootstrap/css/bootstrap.min.css'; 
     } else { 
     curThemePath = 'shinythemes/css/' + curTheme + '.min.css'; 
     } 
     // Find the <link> element with that has the bootstrap.css 
     var $link = $('link').filter(function() { 
     var theme = $(this).attr('href'); 
     theme = theme.replace(/^.*\\//, '').replace(/(\\.min)?\\.css$/, ''); 
     return $.inArray(theme, allThemes) !== -1; 
     }); 
     // Set it to the correct path 
     $link.attr('href', curThemePath); 
     });" 
    ) 
    ) 
    } 

ui <- fluidPage(
    fluidRow(
    column(4, themeSelector()) 
) 
) 

server <- function(input, output) { 

} 

shinyApp(ui, server) 
+0

Ich habe Ihren Code in meine Anwendung eingefügt und es hat perfekt funktioniert. Ich muss Ihren Code noch in meine endgültige Anwendung integrieren, aber ich könnte Ihre Lösung nicht glücklicher sein. – Frek