当我尝试使用outputUI / renderUI组合创建闪亮的动态面板时,我陷入了困境。
到目前为止,我从R Shiny开始,一直在使用函数作为过滤器来分离“ if”语句中不同的输入情况。
library(shiny)
ui<- fluidPage(
sidebarLayout(sidebarPanel(radioButtons("sim","Type de simulation:",
list("Simulation d'un nombre de mélanges déterminés aux paramètres aléatoires" = "alea",
"Simulation de deux mélanges aux paramètres choisis" = "escogido")),
radioButtons("dist", "Distribution type:",list("Normal" = "norm","Poisson" = "poiss")),
uiOutput('InputUser'),
sliderInput("N","Nombre d'observations:", value = 100,min = 50, max = 1000),
uiOutput('InputUser2'),
actionButton("goButton","Allons-y")) ,
mainPanel(
uiOutput('Tables')
)
))
server <- function(input, output, session){
filtre_A<-function(sim,dist) {return(sim=="alea"&dist=="norm")}
filtre_B<-function(sim,dist) {return(sim=="alea"&dist=="poiss")}
filtre_C<-function(sim,dist) {return(sim=="escogido"&dist=="norm")}
filtre_D<-function(sim,dist) {return(sim=="escogido"&dist=="poiss")}
filtre_Z<-function(dim) {return(dim==1)}
filtre_1<-function(sim,dist,dim) {return(sim=="alea"&dist=="norm"&dim>1)}
filtre_2<-function(sim,dist,dim) {return(sim=="alea"&dist=="norm"&dim==1)}
filtre_3<-function(sim,dist,dim) {return(sim=="escogido"&dist=="norm")}
filtre_4<-function(sim,dist,dim) {return(sim=="alea"&dist=="poiss")}
filtre_5<-function(sim,dist,dim) {return(sim=="escogido"&dist=="poiss")}
filtre_6<-function(sim,dist,dim) {return(dist=="norm"&dim==2)}
filtre_7<-function(sim,dist,dim) {return(dist=="norm"&dim==3)}
output$InputUser<- renderUI({
if (filtre_A(input$sim,input$dist)) {
list(numericInput("dim","Dimension du mélange Gaussien",min=1,max=10,value=1),
numericInput("npar","Nombre de lois mélangées",min=2,max=20,value=2))
}
if (filtre_B(input$sim,input$dist)) {
numericInput("npar","Nombre de lois mélangées",min=2,max=20,value=2)
}
if (filtre_C(input$sim,input$dist)) {
list(sliderInput("pi1","π1",min=0.1,max=1.0,step=0.1,value=0.5),
sliderInput("mu1","µ1",min=-10,max=10,step=0.1,value=-5),
sliderInput("sig1","σ1",min=0.1,max=1.0,step=0.01,value=.2),
sliderInput("mu2","µ2",min=-10,max=10,step=0.1,value=5),
sliderInput("sig2","σ2",min=0.1,max=1.0,step=0.01,value=.8))
}
if (filtre_D(input$sim,input$dist)) {
list(sliderInput("pi1","π1",min=0.1,max=1.0,step=0.1,value=.5),
sliderInput("lambda1","λ1",min=0.1,max=10,step=0.1,value=1),
sliderInput("lambda2","λ2",min=0.1,max=10,step=0.1,value=9))
}
})
output$InputUser2 <-renderUI({
if (filtre_Z(input$dim)) {
list(radioButtons("EM", "Implémentation de l'algorithme EM ?",list("Oui" = "Y","Non" = "N")),
conditionalPanel(condition = "input.EM=='Y' & input.dim==1",sliderInput("nmax2","Nombre d'itérations maximum algorithme EM",value=100,min=1000,max=100000)))
}
})
output$Tables <- renderUI({
if ((filtre_2(input$sim,input$dist,input$dim)|
filtre_3(input$sim,input$dist,input$dim)|
filtre_4(input$sim,input$dist,input$dim)|
filtre_5(input$sim,input$dist,input$dim))&(
filtre_8(input$EM,input$dist,input$dim)|
filtre_9(input$EM,input$dist,input$dim))) {
fun<-function(l) {do.call(tabPanel,l)}
myTabs1<-list(list("Figure", plotOutput("figure")),
list("Groupement",plotOutput("clusters")),
list("Paramètres empiriques",plotOutput("esti")),
list("Données",plotOutput("donnes")),
list("Paramètres des lois",plotOutput("parameter")))
myTabs2<-lapply(myTabs1,fun)
do.call(tabsetPanel,myTabs2)
}
if ((filtre_2(input$sim,input$dist,input$dim)|
filtre_3(input$sim,input$dist,input$dim)|
filtre_4(input$sim,input$dist,input$dim)|
filtre_5(input$sim,input$dist,input$dim))&(!(
filtre_8(input$EM,input$dist,input$dim)|
filtre_9(input$EM,input$dist,input$dim)))) {
fun<-function(l) {do.call(tabPanel,l)}
myTabs1<-list(list("Figure", plotOutput("figure")),
list("Groupement",plotOutput("clusters")),
list("Données",plotOutput("donnes")),
list("Paramètres des lois",plotOutput("parameter")))
myTabs2<-lapply(myTabs1,fun)
do.call(tabsetPanel,myTabs2)
}
if (filtre_6(input$sim,input$dist,input$dim)) {
fun<-function(l) {do.call(tabPanel,l)}
myTabs1<-list(list("Groupement",plotOutput("clusters")),
list("Données",plotOutput("donnes")),
list("Paramètres des lois",plotOutput("parameter")))
myTabs2<-lapply(myTabs1,fun)
do.call(tabsetPanel,myTabs2)
}
if (filtre_7(input$sim,input$dist,input$dim)) {
fun<-function(l) {do.call(tabPanel,l)}
myTabs1<-list(list("Figure", plotOutput("figure")),
list("Données",plotOutput("donnes")),
list("Paramètres des lois",plotOutput("parameter")))
myTabs2<-lapply(myTabs1,fun)
do.call(tabsetPanel,myTabs2)
}
if (filtre_1(input$sim,input$dist,input$dim)&(!(filtre_7(input$sim,input$dist,input$dim)|filtre_6(input$sim,input$dist,input$dim)))) {
fun<-function(l) {do.call(tabPanel,l)}
myTabs1<-list( list("Données",plotOutput("donnes")),
list("Paramètres des lois",plotOutput("parameter")))
myTabs2<-lapply(myTabs1,fun)
do.call(tabsetPanel,myTabs2)
}
})
}
shinyApp(ui = ui, server = server)
只要我使用renderPlot / outputPlot renderDataTable等,它似乎就可以工作。但是对于outputUI / renderUI,似乎只有最后一个if语句得到编译。
如果有人向我解释了一种有效的方式来组织我的代码并执行我想要的事情,我将非常感激。