2017-01-03 19 views
1

我已经使用从csv文件读取的数据创建了barplot。Barplot在Shiny中显示1 bar太少和奇怪的细线

最初创建一个过滤器函数来过滤来自RGui的数据并将其应用于barplot()中。 它能够过滤出数据列表并显示5个预期的小节。

添加相同的barplot(多个代码更改),barplot将始终显示1个较少的条,并且还会在非常细的条中显示其余数据。

(见下图)

Server.R

slt <- read.csv("data/slt_inc.csv") 
#extract only the number column 
slt_vec <- c(slt$num_of_inc) 
#extract only the date column 
slt_date <- c(slt$date) 

output$incidentPlot <- renderPlot({barplot(slt_vec, names.arg=slt$date, main="SLT Incidents", xlab="Date", ylab="# of Incidents", col="green", as.Date(slt_date, origin="2016-10-24") >= input$dateRange[1] & as.Date(slt_date, origin="2016-10-24") <= input$dateRange[2])}) 

ui.R

dateRangeInput("dateRange", "Date Selection: ", start="2016-10-24", end=NULL, format="yyyy-mm-dd", min="2016-10-24", language = "en", width="100%"), 
fluidRow(column(6, verbatimTextOutput("date"))), 

任何想法如何解决这个问题,?

另一个可能相关的问题。

使用另一时间范围12月28日至12月30日

CSV文件数据

  • 2016年12月28日,星期三,2
  • 2016年12月29日,星期四,1
  • 2016-12-30,周五,1

它应该显示至少2条或期望3,但一旦我筛选12月28日至12月30日什么都没有显示。

enter image description here

+0

尝试删除'origin'语句。他们不代表你的想法。也可以尝试过滤数据框中的日期,然后提取后面绘制的列。这很容易。另外你的'c(..)'是多余的,'c(..)'构造不是这样使用的。 –

+0

尽管这是一个有趣的故事,但是我太困了,无法追查下来,弄清楚为什么会发生这种情况。 –

+0

最初我在as.Date()中没有“origin”参数。 错误消息中提到了“必须提供原点”一行。一旦我添加了“原点”,它就开始工作。 我会过滤数据框中的日期。 至于C(...)我会认为这将是更好的做法,而不是使用列名称?所以在这种情况下,它就像slt $ num_of_inc。我对么? 再次感谢。 – blitz

回答

2

好吧,两件事情。首先,有趣的细线是因为您打算用于子集数据的逻辑向量实际上被解释为barwidth(第二个未命名的参数)。例如,这barplot函数调用:

barplot(c(5,4,6,3,1,2,4), c(T,T,F,F,F,F,F)) 

获取你这个情节:

enter image description here

更多信息,请参见?barplot

其次我伪造数据,并把一个小例子来告诉你我会怎么处理这个任务:

library(shiny) 

u <- shinyUI(fluidPage(fluidRow(
     dateRangeInput("dateRange","Date Selection: ", 
         start = "2016-10-24",end = NULL, 
        format = "yyyy-mm-dd",min = "2016-10-24", 
        language = "en",width = "100%"), 
     fluidRow(column(6,verbatimTextOutput("date"))), 
     plotOutput('incidentPlot') 
))) 

s <- shinyServer(function(input,output) { 

    # fake up the data 
    dd1 <- c(24,25,26,28,28) 
    sltval1 <- c(5,1,6,7,2) 
    dayval1 <- as.Date(sprintf("2016-10-%2.2d",dd1)) 
    dd2 <- c(7,8,9,12,13,14,15,16,19,20,21,22,23,26,27,28,29,30) 
    sltval2 <- c(6,5,1,3,6,6,1,2,3,6,4,1,0,0,1,2,1,1) 
    dayval2 <- as.Date(sprintf("2016-12-%2.2d",dd2)) 
    slt <- data.frame(date = c(dayval1,dayval2),num_of_inc = c(sltval1,sltval2)) 
    slt$dow <- weekdays(slt$date) 
    # end of data fakery 

    output$date <- renderPrint({ print(input$dateRange) }) 

    output$incidentPlot <- renderPlot({ 
    dmin <- as.Date(input$dateRange[1]) 
    dmax <- as.Date(input$dateRange[2]) 
    bdf <- slt[ dmin<= slt$date & slt$date <= dmax, ] 
    barplot(bdf$num_of_inc,names.arg = bdf$date, col = "green", 
      main="SLT Incidents",xlab="Date",ylab="# of Incidents") 
    }) 
}) 
shinyApp(ui = u,server = s) 

enter image description here

最后,你可能需要如何使用更多的理解和子集数据框和向量,如果您要轻松编写有效的R代码。 R的数据处理和子集化方法与其他语言不同,期望您可以在没有一点研究的情况下进行挑选。

例如,我会推荐仔细阅读至少一些在线书籍Advanced-R,尤其是关于数据结构和子集的两个开始章节 - 或者其他等效的东西。

+0

它看起来很有效。我将需要对我的代码进行一些修改。谢谢您的帮助。目前学习更多关于R. – blitz