将react()元素传递到用户定义的函数中,该函数可生成ShinyApp()

时间:2019-07-03 13:35:30

标签: r shiny r-markdown flexdashboard

我正在制作一个闪亮的仪表板,其中包含许多表,这些表应该看起来和行为相同,但是包含不同的数据。为了使我的代码更具模块化,我编写了一个函数,该函数将保存shinyApp()调用,以便可以重用它。 Here is a link to the official shiny documentation showing the use of shinyApp() within a user defined function

该函数在一定程度上起作用,因为它呈现了一个数据表,但是它对输入的反应数据帧中的变化没有反应。

这是我编写的函数,以及我使用的库和数据表应该对之做出反应的侧栏:

---
title: "Test"
runtime: shiny
output:
  flexdashboard::flex_dashboard: 
    navbar:
    orientation: rows 
    vertical_layout: fill
---
```{r packages, include = FALSE}
library(flexdashboard)
library(DT)
library(dplyr)
library(shiny)
library(datasets)

test_data <- datasets::CO2

data_chart <- function(shiny_data, col_names){
    shinyApp(
        ui = fluidPage(
            DT::dataTableOutput("results")
        ),
        server = function(input, output, session) {
            output$results <- DT::renderDataTable(  
                datatable(      
                shiny_data,
                filter = 'top',
                colnames = col_names,
                rownames = FALSE,
                    options = list(
                        dom = 'lptpi',
                        scrollY = '',
                        order = list(3, 'desc')
                    )
                )
            )
        }
    )
}
```

Header
===

Sidebar {.sidebar}
---

```{r}
checkboxGroupInput(
    inputId = 'Plant1', 
    label = h4("Age Group"),
    choices = list('Qn1', 'Qn2', 'Qn3', 'Qc1', 'Qc2', 'Qc3', 'Mn1', 'Mn2', 'Mn3', 'Mc1', 'Mc2', 'Mc3'),
    selected = c('Qn1', 'Qn2', 'Qn3', 'Qc1', 'Qc2', 'Qc3', 'Mn1', 'Mn2', 'Mn3', 'Mc1', 'Mc2', 'Mc3')
)
```

Row
---

```{r}
data_1 = reactive({test_data %>% 
    filter(Plant %in% input$Plant1) %>% 
    data.frame()
    })

data_chart(test_data, c('Plant', 'Type', 'Treatment', 'Conc', 'Uptake'))

我认为问题与以下事实有关:在函数内,我将反应性数据集“ shiny_data()”称为“ shiny_data”(不带括号),这使其具有静态行为。但是,我尝试添加括号,但出现错误:

ERROR: could not find function "shiny_data()"

此外,我尝试使用react({})包装代码的各个部分,以尝试将数据明确定义为React,但是没有运气。

我确信在函数中包含ShinyApp()并不是问题,因为当我对函数进行反应代码data_1()数据帧的硬编码时,它会对边栏中的更​​改做出反应。这是此结果的示例(该函数与上面的函数完全相同,但是没有将Shiny_data传递给该函数,而是将data_1()硬编码在其中):

Row
---
```{r}
data_chart2 <- function(col_names){
    shinyApp(
        ui = fluidPage(
        DT::dataTableOutput("results")
        ),
        server = function(input, output, session) {
            output$results <- DT::renderDataTable(  
                serverTable <- datatable(       
                    data_1(),
                    filter = 'top',
                    colnames = col_names,
                    rownames = FALSE,
                    options = list(
                        dom = 'lptpi',
                        scrollY = '',
                        order = list(3, 'desc')
                    )
                )
            )
        }
    )
}

data_chart2(c('Plant', 'Type', 'Treatment', 'Conc', 'Uptake'))
```

正如您在两个示例中所看到的,仅当在函数中显式调用反应性数据集时,呈现的数据表中的数据才会发生反应。在将数据输入到用户定义的函数中/由用户定义的函数调用时,有什么方法可以将其视为反应性元素?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

要能够将reactive传递给函数,您需要不带括号地传递它。

data_chart(data_1, c('Plant', 'Type', 'Treatment', 'Conc', 'Uptake'))

您可以在函数内使用参数名称+括号shiny_data()

完整的数据图表功能:

data_chart <- function(shiny_data, col_names){
  shinyApp(
    ui = fluidPage(
      DT::dataTableOutput("results")
    ),
    server = function(input, output, session) {
      output$results <- DT::renderDataTable(  
        datatable(      
          shiny_data(),
          filter = 'top',
          colnames = col_names,
          rownames = FALSE,
          options = list(
            dom = 'lptpi',
            scrollY = '',
            order = list(3, 'desc')
          )
        )
      )
    }
  )
}

输出

output