Как предоставить значения метаданных от сервера к методу пользовательского интерфейса в блестящем - PullRequest
0 голосов
/ 08 марта 2020

Я очень новичок в блеске и бодаться против чего-то, для чего должен быть образец, но не повезло, Гуглинг.

У меня есть простой блестящий файл (приложение R ниже), который возвращает график для n наблюдений. Помимо того, что график доступен для метода ui, я хотел бы передать его n, чтобы помочь ему подобрать размер графика по своему вкусу

library(shiny)

server <- function(input, output) {
  output$distPlot <- renderPlot({
    firstNames <- c("Bob", "Jane", "Bob")
    lastNames <- c("Builder", "Gorillas", "Weave")
    ages <- c(25, 26, 27)
    df <- data.frame(firstNames, lastNames, ages)

    # I want to pass this to `ui`
    numFirstNames <- length(unique(df$firstNames))

    mapping <- aes(x = firstNames, y = ages)
    ggplot(df, mapping) + geom_violin() + coord_flip()
  })
}

getHeightInPx <- function(numFirstNames) {
  paste(100 * numFirstNames, "px", sep="")
}

ui <- fluidPage(
  # I want height to be a function of numFirstNames as calculated in the server definition
  mainPanel(plotOutput("distPlot", height = getHeightInPx(2)))
)

shinyApp(ui, server)

, поскольку ui не является функция и не имеет прямого доступа к выводу (для меня это становится distPlot от framework magi c), как я могу получить данные, подготовленные в server, чтобы помочь разметить страницу?

Спасибо

1 Ответ

0 голосов
/ 06 апреля 2020

https://github.com/rstudio/shiny/issues/650 предупредил меня, что вы можете использовать параметр height в renderPlot. Поэтому я объединил это с некоторым использованием reactive и observe для вызова функции, которая возвращает график И дает мне количество элементов для использования.

Я с трудом получаю reactive и observe, так что, хотя это работает, я не удивлюсь, если узнаю, что я злоупотребляю ими или что есть более простой способ

library(shiny)

renderDistPlot <- function(input) {
  firstNames <- c("Bob", "Jane", "Bob", "Carol")
  lastNames <- c("Builder", "Gorillas", "Weave", "Xmasing")
  ages <- c(25, 26, 27, 23)
  df <- data.frame(firstNames, lastNames, ages)

  # I want to pass this to `ui`
  numFirstNames <- length(unique(df$firstNames))

  mapping <- aes(x = firstNames, y = ages)
  plot <- ggplot(df, mapping) + geom_violin() + coord_flip()
  list(Plot = plot, NumFirstNames = numFirstNames)
}

server <- function(input, output) {
  renderDistPloatResult <- reactive(renderDistPlot(input))
  observe(output$distPlot <- renderPlot(renderDistPloatResult()$Plot, height = renderDistPloatResult()$NumFirstNames * 100))
}

ui <- fluidPage(
  # I want height to be a function of numFirstNames as calculated in the server definition
  mainPanel(plotOutput("distPlot"))
)

shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...