我被建議使用insertUI
here,並發現它是一個很棒的功能。以下代碼允許使用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)
解釋特別對'jQuery'選擇和使用雙逃逸,如果我想修改DIV ID來得心應手。大。 – SatishR