R自动执行selectInput()功能

R自动执行selectInput()功能,r,shiny,R,Shiny,在下面的app.R文件中,我试图为iris数据集的每个列名创建一个selectInput框。然而,我不确定必须用什么来代替省略号selectInput…,“Sepal.Length”,c0,1,才能使它正常工作,而且我也不喜欢我必须键入列本身的名称。当然,我本可以做一些像selectInput…,“namesiris[1]”,c0,1之类的事情,但是我希望创建一些更加自动化和简化的东西,例如,写出selectInput…,“column name”,c0,1,五列中的每一列写五次似乎效率非常低。

在下面的app.R文件中,我试图为iris数据集的每个列名创建一个selectInput框。然而,我不确定必须用什么来代替省略号selectInput…,“Sepal.Length”,c0,1,才能使它正常工作,而且我也不喜欢我必须键入列本身的名称。当然,我本可以做一些像selectInput…,“namesiris[1]”,c0,1之类的事情,但是我希望创建一些更加自动化和简化的东西,例如,写出selectInput…,“column name”,c0,1,五列中的每一列写五次似乎效率非常低。换句话说,也许我可以让Shiny自动识别iris数据集默认有5列,这将适当地创建5个selectInput框


我之所以尝试实现这一点,是因为我想创建一个简单的自动字符向量,如下代码所示,即vec这里是checkboxGroupInput的使用:

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]]),
    checkboxGroupInput('columnNames', 'Column Name', names(iris)),
    numericInput('clusters', 'Cluster count', 3,
                 min = 1, max = 9)
  ),
  mainPanel(
    plotOutput('plot1')
  )
))
要检索选定1而未选定0的列名,可以在服务器端使用以下选项:

> s <- c('Sepal.Length', 'Sepal.Width', 'Petal.Width') # Example vector from checkbox group input
> names(iris) %in% s
[1]  TRUE  TRUE FALSE  TRUE FALSE
> as.integer(names(iris) %in% s)
[1] 1 1 0 1 0
> which(names(iris) %in% s) # Provides vector indices set to 1
[1] 1 2 4
> which(!names(iris) %in% s) # Provides vector indices set to 0
[1] 3 5
> 

您可以只使用selectInput上的multiple=TRUE值来允许选择多个列。然后在服务器端,您只需设置vec即可在UI端使用renderUI,然后在服务器端生成selectInput。实际上,按如下方式使用它是可行的:选择输入'columnName','columnName',namesiris。您尝试为每个列名创建一个单独的下拉列表有什么原因吗?我尝试为每个列名创建一个单独的下拉列表,以便在您尝试创建字符向量vec时,我可以输入该向量,以便选择某些列,为什么不让一个选择输入,多个=真,然后根据选择的选项设置vec?@brittenb您能演示一下答案吗?这听起来很有希望。如果您希望能够同时选择多个值,我建议使用“checkboxGroupInput”,因为它是更合适的UI元素。是的,selectInput中的multiple=TRUE也允许这样做,但在我的视图中,这不是此用例的正确选择。是的,但当我选中其中一个列名时,它实际上不会在字符向量中返回0或1。我想有一个选项可以默认将所有内容都指定为0,然后检查您想要成为1的任何列名。这可能是一个潜在的解决方法,但您需要更新答案以反映这一点。在服务器端使用%input$columnNames中的namesiris%将为您提供一个列名称向量,这些列名称是选定的布尔真/假值。这行吗?我可以更新答案。事实上,它可能会更新,特别是如果您将TRUE指定为1,将FALSE指定为0,或者将FALSE指定为Yes,但是在这里您需要手动键入c1,3,4。。。希望你可以用selectInput或checkboxGroupInputNo来代替勾选框或复选框,这只是一个例子,说明如果x是来自iris的列名向量,那么像我们一样设置vec可以得到结果。在应用程序的UI端,您可以将其设置为selectInput'iris_columns'、'Select columns',choices=namesiris,multiple=TRUE。然后,一旦用户选择了他们的选择,vec将被更新。无需键入任何内容。好的,请随时更新您的完整答案,如果有效,我将测试/接受它。是的,但上面代码中给出的0/1名称在哪里?根据需要保存在vec中。
> s <- c('Sepal.Length', 'Sepal.Width', 'Petal.Width') # Example vector from checkbox group input
> names(iris) %in% s
[1]  TRUE  TRUE FALSE  TRUE FALSE
> as.integer(names(iris) %in% s)
[1] 1 1 0 1 0
> which(names(iris) %in% s) # Provides vector indices set to 1
[1] 1 2 4
> which(!names(iris) %in% s) # Provides vector indices set to 0
[1] 3 5
> 
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('iris_columns', 'Select Columns', choices = names(iris), multiple = TRUE),
    numericInput('clusters', 'Cluster count', 3, min = 1, max = 9)
  ),
  mainPanel(
    plotOutput('plot1')
  )
))

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 <- as.numeric(names(iris) %in% input$iris_columns)
})