这里是server.r
server <- function(input, output) {
output$species <- renderUI({
selectInput("species",
label = "blah",
choices = as.list(unique(iris$Species)))
})
}
然后在ui.r
ui <- fluidPage(
fluidRow(
uiOutput("species")
)
由于我有多个功能,我需要在实际数据框中创建一个类似的过滤器,我尝试用一个函数做同样的事情:
在server.r
中 outputFilters <- function(id, df) {
output$id <- renderUI({
selectInput(id,
label = "blah",
choices = as.list(unique(df$id)))
})
}
outputFilters("species", iris)
然后在ui.r中与uiOutput("species")
之前相同
但是,现在没有下拉列表。据推测,我的功能有缺陷。如何使用函数生成下拉?
答案 0 :(得分:2)
您的问题是每个UI元素在id
output
outputFilters <- function(id, df) {
output[[id]] <- renderUI({
selectInput(id,
label = "blah",
choices = as.list(unique(df[[id]])))
})
}
现在只要id
是函数输入中的字符串,它就应该生成输出元素,你可以参考id
然后,您甚至可以使用lapply
来迭代弗洛里安建议的众多内容。
答案 1 :(得分:1)
请注意,在这种情况下,您也可以不使用单独的函数,方法是将所需的ui组件包装在lapply
中,或将lapply
放在uiOutput
中以创建所有输入一次,下面是两个案例的一个例子。希望这有帮助!
ibrary(shiny)
ui <- fluidPage(
uiOutput('Species'),
uiOutput('Sepal.Length'),
h2('All inputs: '),
uiOutput('my_inputs')
)
server <- function(input, output) {
# Use lapply to create multiple uiOutputs.
lapply(colnames(iris), function(x){
output[[x]] <- renderUI({
selectInput(paste0('input_',x),
label = x,
choices = as.list(unique(iris[['x']])))
})
})
# Create all dropdown's at once.
output$my_inputs <- renderUI({
lapply(colnames(iris), function(x){
selectInput(paste0('input_',x),
label = x,
choices = as.list(unique(iris)))
})
})
}
shinyApp(ui, server)