2016-11-07 39 views
0

我被建議使用insertUIhere,並發現它是一個很棒的功能。以下代碼允許使用insertUI爲單個或多個元素生成控件,但在合併removeUI相關部分時會觸發。嘗試jQuery選項來刪除插入的UI元素,但沒有解決。我發現從Shiny dynamic UI以下,即需要注意的是,如果你是在一個呼叫中插入多個元素,則必須將它們包裝在任何標記表()或標籤$ 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。我用一個帶有id的div來包裝每個滑塊,如div.Sepal.Width,以便更容易移除。 removeUI需要一個jQuery選擇,所以它看起來像#div.Sepal.Width會的工作,但它沒有,因爲.本身就是一個jQuery選擇,這意味着class,所以我們需要加倍逃脫.。當然,你也可以刪除.當你第一次創建的div,從而避免了麻煩......

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

解釋特別對'jQuery'選擇和使用雙逃逸,如果我想修改DIV ID來得心應手。大。 – SatishR