Подтвердить что ты не робот

Как условно изменить соотношение сторон диаграмм в пакете R Shiny?

Просто играя с Shiny и любить его уже. Но как мне получить диаграммы в реактивной комбинации Plot/plotOutput в разных размерах, в зависимости от графика графика?

В этом первом примере я выбрал анализ кривой доходности и получил соотношение сторон, которое я хочу:

enter image description here

Но когда я выбираю другой анализ, в данном случае - карту тепла, теперь она имеет тот же размер, что и диаграмма "Кривая доходности", которая искажает ее (ячейки должны быть квадратными, а не прямоугольными).

enter image description here

Как изменить размер диаграммы в зависимости от того, какой график выбран? Я попытался поставить параметр height = NA, NULL или "", но он не нравится ни один из них.

Отдельно, но в том же приложении, как я могу получить пробелы между верхним selectInput и textInputs в sidebarPanel? Я пробовал h4 (""), но не работает.

Вот мой ui.R:

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"))
))

и вот мой сервер .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)
        )

    })


})
4b9b3361

Ответ 1

(иногда это хорошая идея для RTFM (я тоже говорю с собой, cf мой комментарий к 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.

однако до сих пор мне не удалось заставить работать (с 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: теперь он работает, height должен быть числовым, с необязательными units="px" и res, конечно, что-то, что бы преобразовать units в пиксели.

EDIT 2: и не забудьте обновить Shiny [до последней версии], он исправляет некоторые ошибки, с которыми я столкнулся.

РЕДАКТИРОВАТЬ 3: здесь приведен пример динамического изменения высоты:

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

Вы можете связать фрагмент с этим скриншотом, где getNumberOfPlots возвращает количество графиков для построения.

EDIT 4: если вы хотите отобразить несколько изображений, вы должны изменить height в 'ui.R': это значение напрямую передается в CSS, а значение по умолчанию - 400px. Поэтому, если ваши изображения больше, они будут перекрываться, и будет видно только до 400 пикселей...

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