Я застреваю, когда пытаюсь создать динамическую панель в блестящем, используя комбинацию outputUI / renderUI.
Я начинаю с R блестящий и до сих пор использовал функции в качестве фильтров для разделения различных входных регистров в операторах "если".
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.
Если бы кто-нибудь объяснил мне, как эффективно организовать мой код и делать то, что я хочу, я был бы очень благодарен.