Я делаю блестящую панель инструментов, которая содержит множество таблиц, которые должны отображаться и вести себя одинаково, но содержать разные данные. Для того, чтобы сделать мой код более модульным, я написал функцию, которая будет удерживать вызов поступление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'))
```
Как вы можете видеть в обоих предоставленных примерах, данные в визуализируемом виде данных реагируют только тогда, когда реактивный набор данных явно вызывается в функции. есть ли способ, когда данные вводятся / вызываются пользовательской функцией, они могут рассматриваться как реактивный элемент?
Спасибо за помощь!