R Shiny selectizeInput 到星图矩阵

R Shiny selectizeInput to matrix for stars plot

在我的应用程序中,用户可以上传任何 .csv 文件并绘制它(我使用在线文件简化了示例,我意识到示例图非常无用) .我目前在根据用户输入绘制星星符号时遇到问题。

我想使用 selectizeInput,这样他们就可以 select 任意数量的列来绘制光线的长度。星星需要采用列矩阵,但我认为 selectize returns 作为列表。

我在下面的代码中使用的方法显示了我想要的,但它只需要这么多列。我认为有一种简单的方法可以做到这一点,但我对 R 还很陌生,在搜索时找不到任何有用的东西。

ui.R

shinyUI(pageWithSidebar(
  headerPanel("Scatterplot of star symbols"),
  sidebarPanel(
    selectizeInput("starSpokes", "Select colums for star spoke lengths", c("murder", "Forcible_rate", "Robbery", "aggravated_assult", "burglary"), multiple = TRUE)
  ),
  mainPanel(
    plotOutput("graphPlot")
  )
))

server.R

shinyServer(function(input, output, session) {
  crime = read.csv("http://datasets.flowingdata.com/crimeRatesByState2005.tsv", header = TRUE, sep ="\t") 

  output$graphPlot = renderPlot({
    starRays = cbind(crime[[input$starSpokes[1]]], crime[[input$starSpokes[2]]], crime[[input$starSpokes[3]]], crime[[input$starSpokes[4]]])
    symbols(x=crime$murder, y=crime$burglary, stars = starRays)
  })
})

如果这个问题已经得到解答,我深表歉意,我进行了搜索,但没有找到任何有效的方法,可能是因为我不知道要搜索的正确术语,或者错误地实施了他们的方法。

非常感谢任何帮助,谢谢

selectizeInput 的值只是一个字符向量,因此您可以将它用于 crime 数据框的 select 列。之后你只需要 as.matrix.

output$graphPlot <- renderPlot({
    if(length(input$starSpokes) < 3) return()
    symbols(
        x=crime$murder, y=crime$burglary,
        stars=as.matrix(crime[, input$starSpokes])
    )
})

当您使用 Shiny 时,如果不符合标准,最好检查输入和短路。由于 stars 需要至少三列,因此如果用户没有 select 需要的字段数,则没有理由评估其余代码。