Размещение блестящего рендера в других функциях - PullRequest
0 голосов
/ 18 февраля 2019

Итак, я делаю блестящее приложение, которое принимает несколько входов и создает несколько графиков и таблиц этих входов.

Пример кода RenderTable для создания одной таблицы приведен ниже:

output$Table1 <- 
      renderTable(data.frame(Shape = c("\u25CF", "\u25B2", "\u25FC", ""),
                             "Genes" = c(input$custom_genes1, "Mean"),
                              Analysed_values = c(t(analysis1()), mean(analysis1()))), 
                              striped = TRUE, bordered = TRUE, hover = TRUE)

ГдеShape - это символ на графике, «Genes» - это гены, выбранные с использованием selectizeInput, а analysis1 () - результат реактивного вычисления, определенного ранее в коде.

Однако у меня есть 8-9 таблиц, которыедолжны отображаться в зависимости от различных флажков и т. д. Вместо того, чтобы копировать код и заменять все соответствующие значения, я хотел создать функцию, которую я мог бы использовать для быстрого отображения всех таблиц, и если мне нужно было изменить форматированиеили добавить что-нибудь позже, я могу просто отредактировать функцию, а не каждую таблицу в отдельности.

Я попытался создать функцию многократного использования, используя следующий код:

construct_table <- function(genes_select, dataset){
    renderTable(data.frame(Shape = c("\u25CF", "\u25B2", "\u25FC", ""),
                          "Genes" = genes_select,
                           Analysed_values = c(t(dataset), mean(dataset))), 
                           striped = TRUE, bordered = TRUE, hover = TRUE)
  }

И затем упроститьвызовите каждую таблицу напрямую:

output$Table1 <- construct_table(input$custom_genes1, analysis1())

Это работает в том смысле, что создает таблицу, используя начальные входные значения,но не делает стол реактивным.

Как я могу вызвать реактивную функцию renderTable внутри нормальной функции, или есть еще одна реактивная функция, которую я упустил из виду, что я могу вложить в нее функцию renderTable, которая работает так же, как нормальная функция?

1 Ответ

0 голосов
/ 18 февраля 2019

Простое добавление вызова output$Table1 <- construct_table(input$custom_genes1, analysis1()) в любом месте не будет работать, поскольку analysis() является реактивной переменной, зависящей от других входных данных, которые пользователь может изменить.Следовательно, analysis() может использоваться из реактивного контекста.то есть.изнутри observe, observeEvent, reactive, eventReactive or inside any renderXXX call ex: renderTable, renderPlot...

Когда мы вызываем output$Table1 <- construct_table(input$custom_genes1, analysis1()), мы используем analysis1() из вне реактивного контекста, который вызовет ошибку.Решением является Shiny Modules, который специально разработан для модульного кода, цель которого, кажется, здесь.

https://shiny.rstudio.com/articles/modules.html

Вот пример,

dataset = mtcars

generatePlot = function(input,output,session,data){
  output$plot = renderPlot({
    plot(data()$hp,data()$mpg)
    })
}


generateUI = function(id){
  ns = NS(id)
  plotOutput(ns("plot"))
}

shinyApp(
  ui = {
    fluidPage(
      sliderInput("slider","MPG filter",min(dataset$mpg),max(dataset$mpg),dataset$mpg),
      generateUI("mod1"),
      generateUI("mod2")
    )
  },
  server = function(input,output,session){

    data = eventReactive(input$slider,{
      dataset%>%
        dplyr::filter(between(mpg,input$slider[[1]],input$slider[[2]]))%>%
        return(.)
    })

    callModule(generatePlot,"mod1",data = data)
    callModule(generatePlot,"mod2",data = data)

  }
)

Вы можете добавить еще много идентичных сюжетов, просто добавив новый generateUI и новый callModule вызов.

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