2012-12-09 5 views
11

Nur mit Shiny spielen und es schon lieben. Aber wie bekomme ich Diagramme in der reactivePlot/plotOutput-Kombination, die unterschiedlich groß sein können, abhängig davon, welches Diagramm geplottet wird?Wie kann ich das Seitenverhältnis von Diagrammen im Shiny-Paket von R bedingt ändern?

In diesem ersten Beispiel, ich habe die „yield curve“ Analyse ausgewählt und das Seitenverhältnis Ich will bekommen:

enter image description here

Aber wenn ich eine weitere Analyse, in diesem Fall eine Heatmap wählen, ist es jetzt die gleiche Größe wie die "Yield Curve" -Diagramm, die es verzerrt (Zellen sollten quadratisch, nicht rechteckig sein).

enter image description here

Wie kann ich die Diagrammgröße ändern, je nach dem Diagramm ausgewählt wurde? Ich habe versucht, den Höhenparameter = NA, NULL oder "" zu setzen, aber es mag keines von denen.

Getrennt, aber in der gleichen Anwendung, wie kann ich einige Leerzeichen zwischen dem oberen selectInput und den textInputs im sidebarPanel bekommen? Ich habe versucht, h4 (""), funktioniert aber nicht.

Hier mein ui.R ist:

library(shiny) 

shinyUI(pageWithSidebar(
    headerPanel(h1("SAGB Relative Value Tool")), 
    sidebarPanel(
     h4("Choose analysis:"), 
     selectInput("analysis1", "", 
      choices = c("Yield curve", "Optical asset swap spreads", 
         "Cheap dear box", "Cheap dear charts", "Switch signaliser", 
         "Barbells")), 
     h4(" "), 
     h4("Yield override:"), 
     lapply(bondNames, function(x) 
      textInput(paste(x, "bond"), x, last(sagb$sagb)[x])) 
    ), 
    mainPanel(
     h3(textOutput("AnalysisHeader")), 
     plotOutput("AnalysisOutput", height = "10in")) 
)) 

und hier ist mein server.r

library(shiny) 

shinyServer(function(input, output) { 

    output$AnalysisHeader <- reactiveText(function() { 
     input$analysis1 
    }) 


    output$AnalysisOutput <- reactivePlot(function() { 
     switch(input$analysis1, 
      "Yield curve" = wo(whichOut = 1), 
      "Optical asset swap spreads" = wo(whichOut = 2), 
      "Cheap dear box" = wo(whichOut = 3), 
      "Cheap dear charts" = wo(whichOut = 4), 
      "Switch signaliser" = wo(whichOut = 5), 
      "Barbells" = wo(whichOut = 6) 
     ) 

    }) 


}) 
+0

was sind bondNames? – agstudy

+0

bondNames ist eine globale Listenvariable im Programm, die runApp() aufruft und die Namen der 12 aktiven Anleihen im südafrikanischen Staatsanleihenmarkt ("SAGB") enthält. Hier ist es für die verwendet, um die Sidebar Ertragsüberschreibung Eingänge zu erstellen (etwas schlampig obwohl - ich habe erst jetzt numericInput entdeckt, und ich sollte eine for-Schleife kein lapply verwenden, und meine Paste lässt einen sep = „“ Argument). Für die Frage sowieso nicht relevant. Die Datenstrukturen wo() und sagb $ sagb sind beispielsweise ebenfalls Teil des enthaltenen Codes. –

+0

Ich bin die zweite Frage (falls Leute von Rstudio wissen möchten, wieviele Personen sich für dieses Feature interessieren!), [Mein Grundstück ist derzeit nicht lesbar] (http://i.stack.imgur.com/liY3O.png), aber ich kann die Höhe nicht statisch einstellen, da die Anzahl der Plots entsprechend den dynamischen UIs variiert ... – Kevin

Antwort

9

(manchmal ist es eine gute Idee, RTFM (meiner Selbst, als auch im Gespräch, vgl meine Kommentar zu OP)

reactivePlot(func, width = "auto", height = "auto", ...) 

width The width of the rendered plot, in pixels; or ’auto’ to use the offsetWidth of 
     the HTML element that is bound to this plot. You can also pass in a function 
     that returns the width in pixels or ’auto’; in the body of the function you may 
     reference reactive values and functions. 
*height* The height of the rendered plot, in pixels; or ’auto’ to use the offsetHeight 
     of the HTML element that is bound to this plot. You can also pass in a function 
     that returns the width in pixels or ’auto’; in the body of the function you may 
     reference reactive values and functions. 
...  Arguments to be passed through to png. These can be used to set the width, 
     height, background color, etc. 

jedoch konnte ich bisher nicht zur Arbeit machen verwalten (mit height="15in") ...

Error in switch(units, `in` = res, cm = res/2.54, mm = res/25.4, px = 1) * : 
    non-numeric argument to binary operator 

EDIT: es jetzt funktioniert, height hat numerisch sein, mit optionalen units="px" und res sicherlich etwas units auf Pixel zu konvertieren.

EDIT 2: und vergessen Sie nicht, Shiny [bis zur letzten Version] zu aktualisieren, es behebt einige Bugs, denen ich gegenüberstand.

EDIT 3: hier ist ein Beispiel, wo die Höhe dynamisch geändert wird:

getVarHeight <- function() { 
    return(getNumberOfPlots() * 400) 
} 
output$out <- reactivePlot(doPlots, height=getVarHeight) 

Sie das Snippet zu diesem screenshot beziehen können, wo getNumberOfPlots die Anzahl der Graphen Grundstück zurückgibt.

EDIT 4: Wenn Sie mehr Bilder angezeigt werden sollen, sollten Sie die height in ‚ui.R‘ auch ändern: dieser Wert direkt an CSS übertragen wird, und der Standardwert ist 400px. Also, wenn Ihre Bilder größer sind, werden sie sich überlappen und nur die bis 400px werden sichtbar sein ...

plotOutput(outputId = "plot_rain", height="100%")) 
+0

danke Kevin - ich habe tatsächlich RTFM und habe das gesehen;) aber was stelle ich in die plotOutput Funktion, die einen Default hat Höhe von 400px. –

+0

@Thomas Browne: Ich habe die Antwort mit einem Beispiel aktualisiert – Kevin

+1

Ich glaube, Sie können auch 'height =" auto "' an die 'plotOutput' Funktion übergeben, die das plotOutput die" natürliche "Höhe seines Inhalts verwenden sollte. (Achten Sie darauf, nicht 'Höhe verwenden =„auto“' für beide 'reactivePlot' und' plotOutput' zugleich aber: jeder wird auf der anderen Seite werden in Abhängigkeit der Höhe zu bestimmen, und meine Vermutung ist, dass Sie mit 0px am Ende dann Höhe.) –

Verwandte Themen