2016-11-07 5 views
0

insertUIhereを使用することをお勧めしました。次のコードでは、insertUIを使用して1つまたは複数の要素のコントロールウィジェットを生成することができますが、removeUI関連部分を組み込むことになります。 jQueryは、挿入されたUI要素を削除するオプションを試しましたが、うまくいきませんでした。私はShiny dynamic UIから次のコードを見つけました:1つの呼び出しで複数の要素を挿入する場合は、tagList()またはタグ$ div()で囲む必要があります(後者のオプションは、後で参照や削除を容易にするためのIDを与える)。また、comments hereはいくつかの手がかりを与えました。つまり、tags$div(id="sepal.width.div", sliderInput("sepal.width.slider", ...))ですが、私の欠如はHTML/CSSです。私は、(a)複数のウィジェット要素をタグ$ div()でラップして、各変数に一意のIDを割り当てています。これはremoveUIで使用されます。 (b)removeUIで複数の要素を呼び出す。

varnames <- names(iris[,1:4]) # names 
varinit <- apply(iris[,1:4],2,median) # initival value used in slider 
varmin <- apply(iris[,1:4],2,min) # min. 
varmax <- apply(iris[,1:4],2,max) # max. 

ListofSelVars <<- vector(mode="character") 

# control widgets for all elements 
allControls <- lapply(setNames(varnames, varnames), function(x) { 

    sliderInput(x, x, varmin[x], varmax[x], c(varmin[x], varinit[x]), 
       round = -2) 
}) 

ui <- navbarPage(
    tabPanel("Plot", 
      sidebarLayout(
       sidebarPanel(
        checkboxGroupInput("ConditioningVariables", "Conditioning variables (choose one or more):", 
            varnames,inline = TRUE), 
        # add an action button 
        actionButton("add", "Update UI elements") 
       ), 
       mainPanel() 
      ) 
    ) 
) 

server <- function(input, output, session) { 
    observeEvent(input$add, { 
     insertUI(
     selector ='#add', 
     where = "afterEnd", 
     ui = allControls[setdiff(input$ConditioningVariables,ListofSelVars)] 
    ) 

     ## removeUI related goes, here 
     ## removeUI(selector=paste0()) 
     ## setdiff(ListofSelVars,input$ConditioningVariables) gives elements to be removed 

     ## Global variable, keep track of elements that are selected 

     ListofSelVars <<- input$ConditioningVariables 

    }) 

} 
shinyApp(ui, server) 

答えて

1

ここに作業コードがあります。主な問題はここにある名前(例:Sepal.Width)です。私はdiv.Sepal.Widthのようなidを持つdivで各スライダをラップして、削除しやすくしました。 removeUIにはjQueryセレクタが必要なので、はそれ自体がclassを意味するjQueryセレクタなので、のようなものが動作するように見えるので、.を二重にエスケープする必要があります。私はdivのIDを変更したい場合はもちろん、あなたが最初のようにトラブルを避け、divを作成するときにも.を削除することができます...特に `jQuery`セレクタと二重のエスケープを使用する方法について

varnames <- names(iris[,1:4]) # names 
varinit <- apply(iris[,1:4],2,median) # initival value used in slider 
varmin <- apply(iris[,1:4],2,min) # min. 
varmax <- apply(iris[,1:4],2,max) # max. 

ListofSelVars <<- vector(mode="character") 

# control widgets for all elements 
allControls <- lapply(setNames(varnames, varnames), function(x) { 
    tags$div(id=paste0("div.",x), sliderInput(x, x, varmin[x], varmax[x], c(varmin[x], varinit[x]), 
       round = -2)) 
}) 

ui <- fluidPage(

    titlePanel("Dynamic sliders"), 

    sidebarLayout(
    sidebarPanel(
     checkboxGroupInput("ConditioningVariables", "Conditioning variables (choose one or more):", 
         varnames,inline = TRUE), 
     # add an action button 
     actionButton("add", "Update UI elements") 
    ), 

    mainPanel(
     uiOutput("plot_out") 
    ) 
) 
) 

server <- function(input, output, session) { 
    observeEvent(input$add, { 

    insertUI(
     selector ='#add', 
     where = "afterEnd", 
     ui = allControls[setdiff(input$ConditioningVariables,ListofSelVars)] 
    ) 

    ListofRemoval <- setdiff(ListofSelVars,input$ConditioningVariables) 

    for (item in ListofRemoval) { 
     item = gsub(".", "\\.", item, fixed=TRUE) 
     item = paste0("#div\\.", item) 
     removeUI(item) 
    } 

    ListofSelVars <<- input$ConditioningVariables 

    }) 

} 
shinyApp(ui, server) 
+0

説明は便利です。すばらしいです。 – SatishR

関連する問題