Передайте элемент реагирующий () в пользовательскую функцию, которая делает глянцевыйApp () - PullRequest
1 голос
/ 03 июля 2019

Я делаю блестящую панель инструментов, которая содержит множество таблиц, которые должны отображаться и вести себя одинаково, но содержать разные данные. Для того, чтобы сделать мой код более модульным, я написал функцию, которая будет удерживать вызов поступлениеinyApp (), чтобы его можно было использовать повторно. Вот ссылка на официальную блестящую документацию, демонстрирующую использование brightApp () в определенной пользователем функции .

Функция работает до некоторой степени, потому что она отображает данные, но не реагирует на изменения входного фрейма реактивных данных.

Вот функция, которую я написал, а также библиотеки, которые я использовал, и боковая панель, на которую должен реагировать объект данных:

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

Я думаю, что проблема как-то связана с тем фактом, что внутри функции я называю набор реактивных данных «глянцевый_данных ()» как «блестящий_данных» (без скобок), что заставляет его вести себя статически. Тем не менее, я попытался добавить скобки, и я получаю сообщение об ошибке:

ERROR: could not find function "shiny_data()"

Кроме того, я попытался обернуть различные разделы кода реактивным ({}), чтобы попытаться явно определить данные как реактивные, но безуспешно.

Я уверен, что проблема не в том, что имеется функциярученое отображение () внутри функции, так как когда я создаю функцию, жестко закодированную в фрейме данных реактивного типа data_1 (), он реагирует на изменения в боковой панели. Вот пример этого результата (функция точно такая же, как и выше, но вместо передачи в функцию глянца_данных в 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 Ответ

1 голос
/ 03 июля 2019

Чтобы иметь возможность передать reactive в функцию, вам нужно передать ее без скобок.

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

Вы можете использовать ее в функции с имя аргумента + скобки : shiny_data()

Полная функция data_chart:

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

...