【发布时间】:2016-01-04 16:41:07
【问题描述】:
在下面的 app.R 文件中,我尝试为 iris 数据集的每个列名称创建一个 selectInput() 框。但是,我不确定必须用什么代替省略号 selectInput(..., 'Sepal.Length', c(0, 1)), 才能使其正常工作,而且我也不喜欢我必须输入列本身的名称。当然,我本可以改用selectInput(..., 'names(iris)[1]', c(0, 1)), 之类的东西,但我希望创建一些更加自动化和简化的东西(即,为五列中的每一列写出selectInput(..., 'column name', c(0, 1)), 五次似乎非常低效)。换句话说,也许我可以让 Shiny 自动识别 iris 数据集默认有 5 列,这样可以适当地创建五个 selectInput() 框?
我尝试完成此操作的全部原因是因为我想创建一个简单的自动字符向量(在下面的代码中显示为vec <- c(1,1,0,0,1) #corresponding to c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species)),它会根据我选择0 或1 在上面讨论的各个 selectInput() 框中。
完整代码(关键部分标有井号):
palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3",
"#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999"))
server <- shinyServer(function(input, output, session) {
# Combine the selected variables into a new data frame
selectedData <- reactive({
iris[, c(input$xcol, input$ycol)]
})
clusters <- reactive({
kmeans(selectedData(), input$clusters)
})
output$plot1 <- renderPlot({
par(mar = c(5.1, 4.1, 0, 1))
plot(selectedData(),
col = clusters()$cluster,
pch = 20, cex = 3)
points(clusters()$centers, pch = 4, cex = 4, lwd = 4)
})
#vec <- c(1,1,0,0,1) #corresponding to c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species)
})
ui <- shinyUI(pageWithSidebar(
headerPanel('Iris k-means clustering'),
sidebarPanel(
selectInput('xcol', 'X Variable', names(iris)),
selectInput('ycol', 'Y Variable', names(iris),
selected=names(iris)[[2]]),
#selectInput(..., 'Sepal.Length', c(0, 1)),
#selectInput(..., 'Sepal.Width', c(0, 1)),
#selectInput(..., 'Petal.Length', c(0, 1)),
#selectInput(..., 'Petal.Width', c(0, 1)),
#selectInput(..., 'Species', c(0, 1)),
numericInput('clusters', 'Cluster count', 3,
min = 1, max = 9)
),
mainPanel(
plotOutput('plot1')
)
))
# Return a Shiny app object
shinyApp(ui = ui, server = server)
【问题讨论】:
-
可以在UI端使用renderUI,然后在服务端生成selectInput。实际上,按如下方式使用它会起作用:selectInput('columnName', 'Column Name', names(iris))。您是否有理由尝试为每个列名创建单独的下拉列表?
-
我正在尝试为每个列名创建一个单独的下拉列表,以便我可以输入字符向量
vec <- c(1,1,0,0,1)(即,我可以将其设为c(0,0,1,0,1)或c(1,0,0,0,0)或其他,基于我在下拉菜单中选择的内容) -
如果您想选择某些列,为什么不使用
multiple = TRUE设置selectInput,然后根据选择的选项设置vec? -
@brittenb 你能证明作为答案吗?这听起来很有希望。
-
如果您希望能够同时选择多个值,我建议使用“checkboxGroupInput”,因为它是更合适的 UI 元素。是的,selectInput 中的 multiple = TRUE 也将允许这样做,但在我看来,这不是这个用例的正确选择。