【问题标题】:Null datatable Shiny空数据表闪亮
【发布时间】:2019-02-18 11:12:40
【问题描述】:

我有一个函数可以根据部门编号以及某个时间段内该部门发生的事件次数在 Shiny 中创建数据表。我的问题是,如果日期范围足够短,那么任何部门都不会发生事件。在这些情况下,我收到错误 Error in rowSums(x) : 'x' must be an array of at least two dimensions,它最初只是出现在 Shiny 应用程序中,您可以忽略它。现在,应用程序崩溃了,你必须回到 R 来查看它。

我了解错误发生的原因,但我不知道是否有针对我的情况的解决方法,因为在数据子集之前我不知道事件是否发生。该函数在我的代码中被调用了多次,所以我不想每次使用时都在函数外部编写if 语句。

我尝试在定义 b 之后立即添加 if(length(b$Department <= 1)){tab<-renderDataTable({datatable(NULL)})},然后在函数的其余部分周围添加了一个 else 语句,但我收到了消息 Warning: Error in [.data.frame: undefined columns selected

我还尝试了其他 if 语句,例如创建一个充满 NAs 的数据框,但这返回了原始错误消息。

dept.table<-function(df, date1, date2){
  a<-df[which(DATE >= as.Date(date1) & DATE <= as.Date(date2)),]
  b<-as.data.frame(table((a[,c("Event", "Department")])))
  d<-reshape(b, direction="wide", idvar="Event", timevar="Department")
  names(d)<-sub('^Freq\\.', '', names(d)) 
  d$Total<-round(rowSums(d[,-1]), 0)
  levels(d$Event)<-c(levels(d$Event), "Total")
  d<-rbind(d, c("Total", colSums(d[,-1])))tab<-DT::renderDataTable({
  datatable(d, extensions="FixedColumns", options=list(dom='t', scrollX=T, fixedColumns=list(leftColumns=1, rightColumns=1)), rownames=FALSE)
 })
}

样本数据

 df<-data.frame(Department=rep(100:109, 3), Event=rep(c("A", "B", "C"),10),
     Date=sample(seq(as.Date('2018/01/01'), as.Date('2018/09/01'), by="day"), 30))

【问题讨论】:

    标签: r shiny dt


    【解决方案1】:

    这不是很漂亮,但我想出了一个解决方案。有两个不同的问题。一个是没有数据的时候,一个是只有2个部门的时候,所以我需要两个if语句。

    dept.table<-function(df, date1, date2)  {a<-df[DATE >= as.Date(date1) & DATE <= as.Date(date2)),]
       b<-as.data.frame(table((a[,c("Event", "Department")])))
       if(nrow(b)==0){tab<-DT::renderDataTable(NULL)}
       else{d<-reshape(b, direction="wide", idvar="CODE", timevar="Department")
            names(d)<-sub('^Freq\\.', '', names(d)) 
            if(ncol(d)>3){d$Total<-round(rowSums(d[,-1]), 0)
              levels(d$Event)<-c(levels(d$Event), "Total")
              d<-rbind(d, c("Total", colSums(d[,-1])))
              tab<-DT::renderDataTable({
                   datatable(d, extensions="FixedColumns", options=list(dom='t', scrollX=T, fixedColumns=list(leftColumns=1, rightColumns=1)), rownames=FALSE)})}
            else{tab<-DT::renderDataTable(datatable(d))}
       }
     tab
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-03
      • 2020-05-11
      • 2023-03-20
      • 2017-06-04
      • 2021-02-13
      • 1970-01-01
      • 2017-05-05
      • 2018-07-14
      相关资源
      最近更新 更多