因此,我正在制作一个闪亮的应用程序,该应用程序需要多个输入并生成这些输入的多个图形和表格。
制作一个表格的示例RenderTable代码如下:
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)
}
其中Shape是图形上的符号,“ Genes”是使用selectizeInput选择的基因,analysis1()是代码前面定义的反应式计算的结果。
但是我有8-9个表格需要显示,这取决于各种复选框等。我不想制作粘贴代码并替换所有相关值的方法,而是想创建一个可以用来快速显示所有内容的函数表格,如果以后需要更改格式或添加任何内容,我可以编辑函数,而不必单独编辑每个表格。
我尝试使用下面的代码制作可重复使用的功能:
output$Table1 <- construct_table(input$custom_genes1, analysis1())
然后可以更轻松地直接调用每个表:
{{1}}
此方法的工作原理是使用初始输入值创建表,但不会使表具有反应性。
如何在普通函数内调用renderTable反应函数,或者我是否忽略了另一个可以将renderTable函数嵌套在其中的函数,其工作方式与普通函数相同?
答案 0 :(得分:1)
仅在任意位置添加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,该模块专门设计用于模块化代码,这似乎是这里的目标。
这里是一个例子,
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
调用即可添加更多相同的图。