我正在制作一个闪亮的仪表板,其中包含许多表,这些表应该看起来和行为相同,但是包含不同的数据。为了使我的代码更具模块化,我编写了一个函数,该函数将保存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'))
```
正如您在两个示例中所看到的,仅当在函数中显式调用反应性数据集时,呈现的数据表中的数据才会发生反应。在将数据输入到用户定义的函数中/由用户定义的函数调用时,有什么方法可以将其视为反应性元素?
谢谢您的帮助!
答案 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')
)
)
)
}
)
}