我想在我闪亮的应用程序中避免臭名昭着的for循环,但到目前为止我还没有找到解决方案。这是我的第一个真正的闪亮项目,很高兴收到任何意见。
我的场景是:用户提供数据框。然后,该应用程序会为每列生成一个下拉菜单。 (稍后将用于确定是否应将列视为因子,共线或在线性模型中忽略)
我目前的方法是使用for循环和insertUI函数:
ui.R:
library(shiny)
shinyUI(
fluidPage(
actionButton("ADD","ADD")
)
)
server.R
library(shiny)
opts <- c("A","B")
shinyServer(function(input, output) {
for(i in 1:length(mtcars)){
insertUI(
selector = "#ADD",
where="afterEnd",
ui=selectInput(paste(names(mtcars[i]),"sel"),names(mtcars[i]),opts)
)
}
})
这样可行,但它根本不会感到优雅。 感谢您对我如何改进的意见。
答案 0 :(得分:1)
我将使用lapply
并将结果包装在tagList
中以创建一系列选择器。
library(shiny)
library(ggplot2)
shinyApp(
ui =
shinyUI(
fluidPage(
selectInput(inputId = "data",
label = "Select a dataset",
choices = c("mtcars", "iris")),
uiOutput("select_control")
)
),
server =
shinyServer(function(input, output, session){
dataset <- eventReactive(input$data,
get(input$data))
output$select_control <-
renderUI({
tagList(
lapply(names(dataset()),
function(x)
{
selectInput(inputId = sprintf("select_control_%s",
x),
label = x,
choices = unique(dataset()[[x]]))
}
)
)
})
})
)