R Shiny selectizeInput to matrix for stars plot

时间:2015-08-09 23:33:08

标签: r shiny selectize.js

在我的应用程序中,用户可以上传任何.csv文件并将其绘制为(我通过使用在线文件简化了示例,我意识到示例图非常无用)。我目前无法从用户输入中绘制星星符号。

我想使用selectizeInput,因此他们可以选择任意数量的列作为光线的长度。星星需要采用列的矩阵,但我认为选择返回列表。

我在下面的代码中使用的方法显示了我想要的内容,但它只需要很多列。我假设有一种简单的方法可以做到这一点,但我对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)
  })
})

我很抱歉,如果已经回答了这个问题,我已经搜索过但发现没有任何效果,可能是因为我不知道正确的搜索条件或者他们的方法执行错误。

非常感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:1)

selectizeInput的值只是一个字符向量,因此您可以使用它来选择crime数据框的列。之后,您只需要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至少需要三列,因此如果用户没有选择所需的字段数,则没有理由评估其余代码。